| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227 |
- // Copyright 2015 The go-ethereum Authors
- // This file is part of the go-ethereum library.
- //
- // The go-ethereum library is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Lesser General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // The go-ethereum library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Lesser General Public License for more details.
- //
- // You should have received a copy of the GNU Lesser General Public License
- // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
- package jsre
- const Web3_JS = `
- require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file coder.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var BigNumber = require('bignumber.js');
- var utils = require('../utils/utils');
- var f = require('./formatters');
- var SolidityParam = require('./param');
- /**
- * Should be used to check if a type is an array type
- *
- * @method isArrayType
- * @param {String} type
- * @return {Bool} true is the type is an array, otherwise false
- */
- var isArrayType = function (type) {
- return type.slice(-2) === '[]';
- };
- /**
- * SolidityType prototype is used to encode/decode solidity params of certain type
- */
- var SolidityType = function (config) {
- this._name = config.name;
- this._match = config.match;
- this._mode = config.mode;
- this._inputFormatter = config.inputFormatter;
- this._outputFormatter = config.outputFormatter;
- };
- /**
- * Should be used to determine if this SolidityType do match given type
- *
- * @method isType
- * @param {String} name
- * @return {Bool} true if type match this SolidityType, otherwise false
- */
- SolidityType.prototype.isType = function (name) {
- if (this._match === 'strict') {
- return this._name === name || (name.indexOf(this._name) === 0 && name.slice(this._name.length) === '[]');
- } else if (this._match === 'prefix') {
- // TODO better type detection!
- return name.indexOf(this._name) === 0;
- }
- };
- /**
- * Should be used to transform plain param to SolidityParam object
- *
- * @method formatInput
- * @param {Object} param - plain object, or an array of objects
- * @param {Bool} arrayType - true if a param should be encoded as an array
- * @return {SolidityParam} encoded param wrapped in SolidityParam object
- */
- SolidityType.prototype.formatInput = function (param, arrayType) {
- if (utils.isArray(param) && arrayType) { // TODO: should fail if this two are not the same
- var self = this;
- return param.map(function (p) {
- return self._inputFormatter(p);
- }).reduce(function (acc, current) {
- return acc.combine(current);
- }, f.formatInputInt(param.length)).withOffset(32);
- }
- return this._inputFormatter(param);
- };
- /**
- * Should be used to transoform SolidityParam to plain param
- *
- * @method formatOutput
- * @param {SolidityParam} byteArray
- * @param {Bool} arrayType - true if a param should be decoded as an array
- * @return {Object} plain decoded param
- */
- SolidityType.prototype.formatOutput = function (param, arrayType) {
- if (arrayType) {
- // let's assume, that we solidity will never return long arrays :P
- var result = [];
- var length = new BigNumber(param.dynamicPart().slice(0, 64), 16);
- for (var i = 0; i < length * 64; i += 64) {
- result.push(this._outputFormatter(new SolidityParam(param.dynamicPart().substr(i + 64, 64))));
- }
- return result;
- }
- return this._outputFormatter(param);
- };
- /**
- * Should be used to slice single param from bytes
- *
- * @method sliceParam
- * @param {String} bytes
- * @param {Number} index of param to slice
- * @param {String} type
- * @returns {SolidityParam} param
- */
- SolidityType.prototype.sliceParam = function (bytes, index, type) {
- if (this._mode === 'bytes') {
- return SolidityParam.decodeBytes(bytes, index);
- } else if (isArrayType(type)) {
- return SolidityParam.decodeArray(bytes, index);
- }
- return SolidityParam.decodeParam(bytes, index);
- };
- /**
- * SolidityCoder prototype should be used to encode/decode solidity params of any type
- */
- var SolidityCoder = function (types) {
- this._types = types;
- };
- /**
- * This method should be used to transform type to SolidityType
- *
- * @method _requireType
- * @param {String} type
- * @returns {SolidityType}
- * @throws {Error} throws if no matching type is found
- */
- SolidityCoder.prototype._requireType = function (type) {
- var solidityType = this._types.filter(function (t) {
- return t.isType(type);
- })[0];
- if (!solidityType) {
- throw Error('invalid solidity type!: ' + type);
- }
- return solidityType;
- };
- /**
- * Should be used to transform plain param of given type to SolidityParam
- *
- * @method _formatInput
- * @param {String} type of param
- * @param {Object} plain param
- * @return {SolidityParam}
- */
- SolidityCoder.prototype._formatInput = function (type, param) {
- return this._requireType(type).formatInput(param, isArrayType(type));
- };
- /**
- * Should be used to encode plain param
- *
- * @method encodeParam
- * @param {String} type
- * @param {Object} plain param
- * @return {String} encoded plain param
- */
- SolidityCoder.prototype.encodeParam = function (type, param) {
- return this._formatInput(type, param).encode();
- };
- /**
- * Should be used to encode list of params
- *
- * @method encodeParams
- * @param {Array} types
- * @param {Array} params
- * @return {String} encoded list of params
- */
- SolidityCoder.prototype.encodeParams = function (types, params) {
- var self = this;
- var solidityParams = types.map(function (type, index) {
- return self._formatInput(type, params[index]);
- });
- return SolidityParam.encodeList(solidityParams);
- };
- /**
- * Should be used to decode bytes to plain param
- *
- * @method decodeParam
- * @param {String} type
- * @param {String} bytes
- * @return {Object} plain param
- */
- SolidityCoder.prototype.decodeParam = function (type, bytes) {
- return this.decodeParams([type], bytes)[0];
- };
- /**
- * Should be used to decode list of params
- *
- * @method decodeParam
- * @param {Array} types
- * @param {String} bytes
- * @return {Array} array of plain params
- */
- SolidityCoder.prototype.decodeParams = function (types, bytes) {
- var self = this;
- return types.map(function (type, index) {
- var solidityType = self._requireType(type);
- var p = solidityType.sliceParam(bytes, index, type);
- return solidityType.formatOutput(p, isArrayType(type));
- });
- };
- var coder = new SolidityCoder([
- new SolidityType({
- name: 'address',
- match: 'strict',
- mode: 'value',
- inputFormatter: f.formatInputInt,
- outputFormatter: f.formatOutputAddress
- }),
- new SolidityType({
- name: 'bool',
- match: 'strict',
- mode: 'value',
- inputFormatter: f.formatInputBool,
- outputFormatter: f.formatOutputBool
- }),
- new SolidityType({
- name: 'int',
- match: 'prefix',
- mode: 'value',
- inputFormatter: f.formatInputInt,
- outputFormatter: f.formatOutputInt,
- }),
- new SolidityType({
- name: 'uint',
- match: 'prefix',
- mode: 'value',
- inputFormatter: f.formatInputInt,
- outputFormatter: f.formatOutputUInt
- }),
- new SolidityType({
- name: 'bytes',
- match: 'strict',
- mode: 'bytes',
- inputFormatter: f.formatInputDynamicBytes,
- outputFormatter: f.formatOutputDynamicBytes
- }),
- new SolidityType({
- name: 'bytes',
- match: 'prefix',
- mode: 'value',
- inputFormatter: f.formatInputBytes,
- outputFormatter: f.formatOutputBytes
- }),
- new SolidityType({
- name: 'string',
- match: 'strict',
- mode: 'bytes',
- inputFormatter: f.formatInputString,
- outputFormatter: f.formatOutputString
- }),
- new SolidityType({
- name: 'real',
- match: 'prefix',
- mode: 'value',
- inputFormatter: f.formatInputReal,
- outputFormatter: f.formatOutputReal
- }),
- new SolidityType({
- name: 'ureal',
- match: 'prefix',
- mode: 'value',
- inputFormatter: f.formatInputReal,
- outputFormatter: f.formatOutputUReal
- })
- ]);
- module.exports = coder;
- },{"../utils/utils":7,"./formatters":2,"./param":3,"bignumber.js":"bignumber.js"}],2:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file formatters.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var BigNumber = require('bignumber.js');
- var utils = require('../utils/utils');
- var c = require('../utils/config');
- var SolidityParam = require('./param');
- /**
- * Formats input value to byte representation of int
- * If value is negative, return it's two's complement
- * If the value is floating point, round it down
- *
- * @method formatInputInt
- * @param {String|Number|BigNumber} value that needs to be formatted
- * @returns {SolidityParam}
- */
- var formatInputInt = function (value) {
- var padding = c.ETH_PADDING * 2;
- BigNumber.config(c.ETH_BIGNUMBER_ROUNDING_MODE);
- var result = utils.padLeft(utils.toTwosComplement(value).round().toString(16), padding);
- return new SolidityParam(result);
- };
- /**
- * Formats input bytes
- *
- * @method formatInputBytes
- * @param {String}
- * @returns {SolidityParam}
- */
- var formatInputBytes = function (value) {
- var result = utils.padRight(utils.toHex(value).substr(2), 64);
- return new SolidityParam(result);
- };
- /**
- * Formats input bytes
- *
- * @method formatDynamicInputBytes
- * @param {String}
- * @returns {SolidityParam}
- */
- var formatInputDynamicBytes = function (value) {
- var result = utils.toHex(value).substr(2);
- var length = result.length / 2;
- var l = Math.floor((result.length + 63) / 64);
- var result = utils.padRight(result, l * 64);
- return new SolidityParam(formatInputInt(length).value + result, 32);
- };
- /**
- * Formats input value to byte representation of string
- *
- * @method formatInputString
- * @param {String}
- * @returns {SolidityParam}
- */
- var formatInputString = function (value) {
- var result = utils.fromAscii(value).substr(2);
- var length = result.length / 2;
- var l = Math.floor((result.length + 63) / 64);
- result = utils.padRight(result, l * 64);
- return new SolidityParam(formatInputInt(length).value + result, 32);
- };
- /**
- * Formats input value to byte representation of bool
- *
- * @method formatInputBool
- * @param {Boolean}
- * @returns {SolidityParam}
- */
- var formatInputBool = function (value) {
- var result = '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0');
- return new SolidityParam(result);
- };
- /**
- * Formats input value to byte representation of real
- * Values are multiplied by 2^m and encoded as integers
- *
- * @method formatInputReal
- * @param {String|Number|BigNumber}
- * @returns {SolidityParam}
- */
- var formatInputReal = function (value) {
- return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));
- };
- /**
- * Check if input value is negative
- *
- * @method signedIsNegative
- * @param {String} value is hex format
- * @returns {Boolean} true if it is negative, otherwise false
- */
- var signedIsNegative = function (value) {
- return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1';
- };
- /**
- * Formats right-aligned output bytes to int
- *
- * @method formatOutputInt
- * @param {SolidityParam} param
- * @returns {BigNumber} right-aligned output bytes formatted to big number
- */
- var formatOutputInt = function (param) {
- var value = param.staticPart() || "0";
- // check if it's negative number
- // it it is, return two's complement
- if (signedIsNegative(value)) {
- return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1);
- }
- return new BigNumber(value, 16);
- };
- /**
- * Formats right-aligned output bytes to uint
- *
- * @method formatOutputUInt
- * @param {SolidityParam}
- * @returns {BigNumeber} right-aligned output bytes formatted to uint
- */
- var formatOutputUInt = function (param) {
- var value = param.staticPart() || "0";
- return new BigNumber(value, 16);
- };
- /**
- * Formats right-aligned output bytes to real
- *
- * @method formatOutputReal
- * @param {SolidityParam}
- * @returns {BigNumber} input bytes formatted to real
- */
- var formatOutputReal = function (param) {
- return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128));
- };
- /**
- * Formats right-aligned output bytes to ureal
- *
- * @method formatOutputUReal
- * @param {SolidityParam}
- * @returns {BigNumber} input bytes formatted to ureal
- */
- var formatOutputUReal = function (param) {
- return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128));
- };
- /**
- * Should be used to format output bool
- *
- * @method formatOutputBool
- * @param {SolidityParam}
- * @returns {Boolean} right-aligned input bytes formatted to bool
- */
- var formatOutputBool = function (param) {
- return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false;
- };
- /**
- * Should be used to format output bytes
- *
- * @method formatOutputBytes
- * @param {SolidityParam} left-aligned hex representation of string
- * @returns {String} hex string
- */
- var formatOutputBytes = function (param) {
- return '0x' + param.staticPart();
- };
- /**
- * Should be used to format output bytes
- *
- * @method formatOutputDynamicBytes
- * @param {SolidityParam} left-aligned hex representation of string
- * @returns {String} hex string
- */
- var formatOutputDynamicBytes = function (param) {
- var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
- return '0x' + param.dynamicPart().substr(64, length);
- };
- /**
- * Should be used to format output string
- *
- * @method formatOutputString
- * @param {SolidityParam} left-aligned hex representation of string
- * @returns {String} ascii string
- */
- var formatOutputString = function (param) {
- var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
- return utils.toAscii(param.dynamicPart().substr(64, length));
- };
- /**
- * Should be used to format output address
- *
- * @method formatOutputAddress
- * @param {SolidityParam} right-aligned input bytes
- * @returns {String} address
- */
- var formatOutputAddress = function (param) {
- var value = param.staticPart();
- return "0x" + value.slice(value.length - 40, value.length);
- };
- module.exports = {
- formatInputInt: formatInputInt,
- formatInputBytes: formatInputBytes,
- formatInputDynamicBytes: formatInputDynamicBytes,
- formatInputString: formatInputString,
- formatInputBool: formatInputBool,
- formatInputReal: formatInputReal,
- formatOutputInt: formatOutputInt,
- formatOutputUInt: formatOutputUInt,
- formatOutputReal: formatOutputReal,
- formatOutputUReal: formatOutputUReal,
- formatOutputBool: formatOutputBool,
- formatOutputBytes: formatOutputBytes,
- formatOutputDynamicBytes: formatOutputDynamicBytes,
- formatOutputString: formatOutputString,
- formatOutputAddress: formatOutputAddress
- };
- },{"../utils/config":5,"../utils/utils":7,"./param":3,"bignumber.js":"bignumber.js"}],3:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file param.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var utils = require('../utils/utils');
- /**
- * SolidityParam object prototype.
- * Should be used when encoding, decoding solidity bytes
- */
- var SolidityParam = function (value, offset) {
- this.value = value || '';
- this.offset = offset; // offset in bytes
- };
- /**
- * This method should be used to get length of params's dynamic part
- *
- * @method dynamicPartLength
- * @returns {Number} length of dynamic part (in bytes)
- */
- SolidityParam.prototype.dynamicPartLength = function () {
- return this.dynamicPart().length / 2;
- };
- /**
- * This method should be used to create copy of solidity param with different offset
- *
- * @method withOffset
- * @param {Number} offset length in bytes
- * @returns {SolidityParam} new solidity param with applied offset
- */
- SolidityParam.prototype.withOffset = function (offset) {
- return new SolidityParam(this.value, offset);
- };
- /**
- * This method should be used to combine solidity params together
- * eg. when appending an array
- *
- * @method combine
- * @param {SolidityParam} param with which we should combine
- * @param {SolidityParam} result of combination
- */
- SolidityParam.prototype.combine = function (param) {
- return new SolidityParam(this.value + param.value);
- };
- /**
- * This method should be called to check if param has dynamic size.
- * If it has, it returns true, otherwise false
- *
- * @method isDynamic
- * @returns {Boolean}
- */
- SolidityParam.prototype.isDynamic = function () {
- return this.value.length > 64 || this.offset !== undefined;
- };
- /**
- * This method should be called to transform offset to bytes
- *
- * @method offsetAsBytes
- * @returns {String} bytes representation of offset
- */
- SolidityParam.prototype.offsetAsBytes = function () {
- return !this.isDynamic() ? '' : utils.padLeft(utils.toTwosComplement(this.offset).toString(16), 64);
- };
- /**
- * This method should be called to get static part of param
- *
- * @method staticPart
- * @returns {String} offset if it is a dynamic param, otherwise value
- */
- SolidityParam.prototype.staticPart = function () {
- if (!this.isDynamic()) {
- return this.value;
- }
- return this.offsetAsBytes();
- };
- /**
- * This method should be called to get dynamic part of param
- *
- * @method dynamicPart
- * @returns {String} returns a value if it is a dynamic param, otherwise empty string
- */
- SolidityParam.prototype.dynamicPart = function () {
- return this.isDynamic() ? this.value : '';
- };
- /**
- * This method should be called to encode param
- *
- * @method encode
- * @returns {String}
- */
- SolidityParam.prototype.encode = function () {
- return this.staticPart() + this.dynamicPart();
- };
- /**
- * This method should be called to encode array of params
- *
- * @method encodeList
- * @param {Array[SolidityParam]} params
- * @returns {String}
- */
- SolidityParam.encodeList = function (params) {
-
- // updating offsets
- var totalOffset = params.length * 32;
- var offsetParams = params.map(function (param) {
- if (!param.isDynamic()) {
- return param;
- }
- var offset = totalOffset;
- totalOffset += param.dynamicPartLength();
- return param.withOffset(offset);
- });
- // encode everything!
- return offsetParams.reduce(function (result, param) {
- return result + param.dynamicPart();
- }, offsetParams.reduce(function (result, param) {
- return result + param.staticPart();
- }, ''));
- };
- /**
- * This method should be used to decode plain (static) solidity param at given index
- *
- * @method decodeParam
- * @param {String} bytes
- * @param {Number} index
- * @returns {SolidityParam}
- */
- SolidityParam.decodeParam = function (bytes, index) {
- index = index || 0;
- return new SolidityParam(bytes.substr(index * 64, 64));
- };
- /**
- * This method should be called to get offset value from bytes at given index
- *
- * @method getOffset
- * @param {String} bytes
- * @param {Number} index
- * @returns {Number} offset as number
- */
- var getOffset = function (bytes, index) {
- // we can do this cause offset is rather small
- return parseInt('0x' + bytes.substr(index * 64, 64));
- };
- /**
- * This method should be called to decode solidity bytes param at given index
- *
- * @method decodeBytes
- * @param {String} bytes
- * @param {Number} index
- * @returns {SolidityParam}
- */
- SolidityParam.decodeBytes = function (bytes, index) {
- index = index || 0;
- var offset = getOffset(bytes, index);
- var l = parseInt('0x' + bytes.substr(offset * 2, 64));
- l = Math.floor((l + 31) / 32);
- // (1 + l) * , cause we also parse length
- return new SolidityParam(bytes.substr(offset * 2, (1 + l) * 64), 0);
- };
- /**
- * This method should be used to decode solidity array at given index
- *
- * @method decodeArray
- * @param {String} bytes
- * @param {Number} index
- * @returns {SolidityParam}
- */
- SolidityParam.decodeArray = function (bytes, index) {
- index = index || 0;
- var offset = getOffset(bytes, index);
- var length = parseInt('0x' + bytes.substr(offset * 2, 64));
- return new SolidityParam(bytes.substr(offset * 2, (length + 1) * 64), 0);
- };
- module.exports = SolidityParam;
- },{"../utils/utils":7}],4:[function(require,module,exports){
- 'use strict';
- // go env doesn't have and need XMLHttpRequest
- if (typeof XMLHttpRequest === 'undefined') {
- exports.XMLHttpRequest = {};
- } else {
- exports.XMLHttpRequest = XMLHttpRequest; // jshint ignore:line
- }
- },{}],5:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /** @file config.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- /**
- * Utils
- *
- * @module utils
- */
- /**
- * Utility functions
- *
- * @class [utils] config
- * @constructor
- */
- /// required to define ETH_BIGNUMBER_ROUNDING_MODE
- var BigNumber = require('bignumber.js');
- var ETH_UNITS = [
- 'wei',
- 'kwei',
- 'Mwei',
- 'Gwei',
- 'szabo',
- 'finney',
- 'femtoether',
- 'picoether',
- 'nanoether',
- 'microether',
- 'milliether',
- 'nano',
- 'micro',
- 'milli',
- 'ether',
- 'grand',
- 'Mether',
- 'Gether',
- 'Tether',
- 'Pether',
- 'Eether',
- 'Zether',
- 'Yether',
- 'Nether',
- 'Dether',
- 'Vether',
- 'Uether'
- ];
- module.exports = {
- ETH_PADDING: 32,
- ETH_SIGNATURE_LENGTH: 4,
- ETH_UNITS: ETH_UNITS,
- ETH_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN },
- ETH_POLLING_TIMEOUT: 1000/2,
- defaultBlock: 'latest',
- defaultAccount: undefined
- };
- },{"bignumber.js":"bignumber.js"}],6:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file sha3.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var utils = require('./utils');
- var sha3 = require('crypto-js/sha3');
- module.exports = function (str, isNew) {
- if (str.substr(0, 2) === '0x' && !isNew) {
- console.warn('requirement of using web3.fromAscii before sha3 is deprecated');
- console.warn('new usage: \'web3.sha3("hello")\'');
- console.warn('see https://github.com/ethereum/web3.js/pull/205');
- console.warn('if you need to hash hex value, you can do \'sha3("0xfff", true)\'');
- str = utils.toAscii(str);
- }
- return sha3(str, {
- outputLength: 256
- }).toString();
- };
- },{"./utils":7,"crypto-js/sha3":34}],7:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file utils.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- /**
- * Utils
- *
- * @module utils
- */
- /**
- * Utility functions
- *
- * @class [utils] utils
- * @constructor
- */
- var BigNumber = require('bignumber.js');
- var unitMap = {
- 'wei': '1',
- 'kwei': '1000',
- 'ada': '1000',
- 'femtoether': '1000',
- 'mwei': '1000000',
- 'babbage': '1000000',
- 'picoether': '1000000',
- 'gwei': '1000000000',
- 'shannon': '1000000000',
- 'nanoether': '1000000000',
- 'nano': '1000000000',
- 'szabo': '1000000000000',
- 'microether': '1000000000000',
- 'micro': '1000000000000',
- 'finney': '1000000000000000',
- 'milliether': '1000000000000000',
- 'milli': '1000000000000000',
- 'ether': '1000000000000000000',
- 'kether': '1000000000000000000000',
- 'grand': '1000000000000000000000',
- 'einstein': '1000000000000000000000',
- 'mether': '1000000000000000000000000',
- 'gether': '1000000000000000000000000000',
- 'tether': '1000000000000000000000000000000'
- };
- /**
- * Should be called to pad string to expected length
- *
- * @method padLeft
- * @param {String} string to be padded
- * @param {Number} characters that result string should have
- * @param {String} sign, by default 0
- * @returns {String} right aligned string
- */
- var padLeft = function (string, chars, sign) {
- return new Array(chars - string.length + 1).join(sign ? sign : "0") + string;
- };
- /**
- * Should be called to pad string to expected length
- *
- * @method padRight
- * @param {String} string to be padded
- * @param {Number} characters that result string should have
- * @param {String} sign, by default 0
- * @returns {String} right aligned string
- */
- var padRight = function (string, chars, sign) {
- return string + (new Array(chars - string.length + 1).join(sign ? sign : "0"));
- };
- /**
- * Should be called to get sting from it's hex representation
- * TODO: it should be called toUTF8
- *
- * @method toAscii
- * @param {String} string in hex
- * @returns {String} ascii string representation of hex value
- */
- var toAscii = function(hex) {
- // Find termination
- var str = "";
- var i = 0, l = hex.length;
- if (hex.substring(0, 2) === '0x') {
- i = 2;
- }
- for (; i < l; i+=2) {
- var code = parseInt(hex.substr(i, 2), 16);
- str += String.fromCharCode(code);
- }
- return decodeURIComponent(escape(str));
- };
-
- /**
- * Shold be called to get hex representation (prefixed by 0x) of ascii string
- *
- * @method toHexNative
- * @param {String} string
- * @returns {String} hex representation of input string
- */
- var toHexNative = function(str) {
- str = unescape(encodeURIComponent(str));
- var hex = "";
- for(var i = 0; i < str.length; i++) {
- var n = str.charCodeAt(i).toString(16);
- hex += n.length < 2 ? '0' + n : n;
- }
- return hex;
- };
- /**
- * Shold be called to get hex representation (prefixed by 0x) of ascii string
- *
- * @method fromAscii
- * @param {String} string
- * @param {Number} optional padding
- * @returns {String} hex representation of input string
- */
- var fromAscii = function(str, pad) {
- pad = pad === undefined ? 0 : pad;
- var hex = toHexNative(str);
- while (hex.length < pad*2)
- hex += "00";
- return "0x" + hex;
- };
- /**
- * Should be used to create full function/event name from json abi
- *
- * @method transformToFullName
- * @param {Object} json-abi
- * @return {String} full fnction/event name
- */
- var transformToFullName = function (json) {
- if (json.name.indexOf('(') !== -1) {
- return json.name;
- }
- var typeName = json.inputs.map(function(i){return i.type; }).join();
- return json.name + '(' + typeName + ')';
- };
- /**
- * Should be called to get display name of contract function
- *
- * @method extractDisplayName
- * @param {String} name of function/event
- * @returns {String} display name for function/event eg. multiply(uint256) -> multiply
- */
- var extractDisplayName = function (name) {
- var length = name.indexOf('(');
- return length !== -1 ? name.substr(0, length) : name;
- };
- /// @returns overloaded part of function/event name
- var extractTypeName = function (name) {
- /// TODO: make it invulnerable
- var length = name.indexOf('(');
- return length !== -1 ? name.substr(length + 1, name.length - 1 - (length + 1)).replace(' ', '') : "";
- };
- /**
- * Converts value to it's decimal representation in string
- *
- * @method toDecimal
- * @param {String|Number|BigNumber}
- * @return {String}
- */
- var toDecimal = function (value) {
- return toBigNumber(value).toNumber();
- };
- /**
- * Converts value to it's hex representation
- *
- * @method fromDecimal
- * @param {String|Number|BigNumber}
- * @return {String}
- */
- var fromDecimal = function (value) {
- var number = toBigNumber(value);
- var result = number.toString(16);
- return number.lessThan(0) ? '-0x' + result.substr(1) : '0x' + result;
- };
- /**
- * Auto converts any given value into it's hex representation.
- *
- * And even stringifys objects before.
- *
- * @method toHex
- * @param {String|Number|BigNumber|Object}
- * @return {String}
- */
- var toHex = function (val) {
- /*jshint maxcomplexity: 8 */
- if (isBoolean(val))
- return fromDecimal(+val);
- if (isBigNumber(val))
- return fromDecimal(val);
- if (isObject(val))
- return fromAscii(JSON.stringify(val));
- // if its a negative number, pass it through fromDecimal
- if (isString(val)) {
- if (val.indexOf('-0x') === 0)
- return fromDecimal(val);
- else if (!isFinite(val))
- return fromAscii(val);
- else if(val.indexOf('0x') === 0)
- return val;
- }
- return fromDecimal(val);
- };
- /**
- * Returns value of unit in Wei
- *
- * @method getValueOfUnit
- * @param {String} unit the unit to convert to, default ether
- * @returns {BigNumber} value of the unit (in Wei)
- * @throws error if the unit is not correct:w
- */
- var getValueOfUnit = function (unit) {
- unit = unit ? unit.toLowerCase() : 'ether';
- var unitValue = unitMap[unit];
- if (unitValue === undefined) {
- throw new Error('This unit doesn\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2));
- }
- return new BigNumber(unitValue, 10);
- };
- /**
- * Takes a number of wei and converts it to any other ether unit.
- *
- * Possible units are:
- * SI Short SI Full Effigy Other
- * - kwei femtoether ada
- * - mwei picoether babbage
- * - gwei nanoether shannon nano
- * - -- microether szabo micro
- * - -- milliether finney milli
- * - ether -- --
- * - kether einstein grand
- * - mether
- * - gether
- * - tether
- *
- * @method fromWei
- * @param {Number|String} number can be a number, number string or a HEX of a decimal
- * @param {String} unit the unit to convert to, default ether
- * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number
- */
- var fromWei = function(number, unit) {
- var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit));
- return isBigNumber(number) ? returnValue : returnValue.toString(10);
- };
- /**
- * Takes a number of a unit and converts it to wei.
- *
- * Possible units are:
- * SI Short SI Full Effigy Other
- * - kwei femtoether ada
- * - mwei picoether babbage
- * - gwei nanoether shannon nano
- * - -- microether szabo micro
- * - -- milliether finney milli
- * - ether -- --
- * - kether einstein grand
- * - mether
- * - gether
- * - tether
- *
- * @method toWei
- * @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal
- * @param {String} unit the unit to convert from, default ether
- * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number
- */
- var toWei = function(number, unit) {
- var returnValue = toBigNumber(number).times(getValueOfUnit(unit));
- return isBigNumber(number) ? returnValue : returnValue.toString(10);
- };
- /**
- * Takes an input and transforms it into an bignumber
- *
- * @method toBigNumber
- * @param {Number|String|BigNumber} a number, string, HEX string or BigNumber
- * @return {BigNumber} BigNumber
- */
- var toBigNumber = function(number) {
- /*jshint maxcomplexity:5 */
- number = number || 0;
- if (isBigNumber(number))
- return number;
- if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) {
- return new BigNumber(number.replace('0x',''), 16);
- }
-
- return new BigNumber(number.toString(10), 10);
- };
- /**
- * Takes and input transforms it into bignumber and if it is negative value, into two's complement
- *
- * @method toTwosComplement
- * @param {Number|String|BigNumber}
- * @return {BigNumber}
- */
- var toTwosComplement = function (number) {
- var bigNumber = toBigNumber(number);
- if (bigNumber.lessThan(0)) {
- return new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(bigNumber).plus(1);
- }
- return bigNumber;
- };
- /**
- * Checks if the given string is strictly an address
- *
- * @method isStrictAddress
- * @param {String} address the given HEX adress
- * @return {Boolean}
- */
- var isStrictAddress = function (address) {
- return /^0x[0-9a-f]{40}$/.test(address);
- };
- /**
- * Checks if the given string is an address
- *
- * @method isAddress
- * @param {String} address the given HEX adress
- * @return {Boolean}
- */
- var isAddress = function (address) {
- return /^(0x)?[0-9a-f]{40}$/.test(address);
- };
- /**
- * Transforms given string to valid 20 bytes-length addres with 0x prefix
- *
- * @method toAddress
- * @param {String} address
- * @return {String} formatted address
- */
- var toAddress = function (address) {
- if (isStrictAddress(address)) {
- return address;
- }
-
- if (/^[0-9a-f]{40}$/.test(address)) {
- return '0x' + address;
- }
- return '0x' + padLeft(toHex(address).substr(2), 40);
- };
- /**
- * Returns true if object is BigNumber, otherwise false
- *
- * @method isBigNumber
- * @param {Object}
- * @return {Boolean}
- */
- var isBigNumber = function (object) {
- return object instanceof BigNumber ||
- (object && object.constructor && object.constructor.name === 'BigNumber');
- };
- /**
- * Returns true if object is string, otherwise false
- *
- * @method isString
- * @param {Object}
- * @return {Boolean}
- */
- var isString = function (object) {
- return typeof object === 'string' ||
- (object && object.constructor && object.constructor.name === 'String');
- };
- /**
- * Returns true if object is function, otherwise false
- *
- * @method isFunction
- * @param {Object}
- * @return {Boolean}
- */
- var isFunction = function (object) {
- return typeof object === 'function';
- };
- /**
- * Returns true if object is Objet, otherwise false
- *
- * @method isObject
- * @param {Object}
- * @return {Boolean}
- */
- var isObject = function (object) {
- return typeof object === 'object';
- };
- /**
- * Returns true if object is boolean, otherwise false
- *
- * @method isBoolean
- * @param {Object}
- * @return {Boolean}
- */
- var isBoolean = function (object) {
- return typeof object === 'boolean';
- };
- /**
- * Returns true if object is array, otherwise false
- *
- * @method isArray
- * @param {Object}
- * @return {Boolean}
- */
- var isArray = function (object) {
- return object instanceof Array;
- };
- /**
- * Returns true if given string is valid json object
- *
- * @method isJson
- * @param {String}
- * @return {Boolean}
- */
- var isJson = function (str) {
- try {
- return !!JSON.parse(str);
- } catch (e) {
- return false;
- }
- };
- /**
- * This method should be called to check if string is valid ethereum IBAN number
- * Supports direct and indirect IBANs
- *
- * @method isIBAN
- * @param {String}
- * @return {Boolean}
- */
- var isIBAN = function (iban) {
- return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30})$/.test(iban);
- };
- module.exports = {
- padLeft: padLeft,
- padRight: padRight,
- toHex: toHex,
- toDecimal: toDecimal,
- fromDecimal: fromDecimal,
- toAscii: toAscii,
- fromAscii: fromAscii,
- transformToFullName: transformToFullName,
- extractDisplayName: extractDisplayName,
- extractTypeName: extractTypeName,
- toWei: toWei,
- fromWei: fromWei,
- toBigNumber: toBigNumber,
- toTwosComplement: toTwosComplement,
- toAddress: toAddress,
- isBigNumber: isBigNumber,
- isStrictAddress: isStrictAddress,
- isAddress: isAddress,
- isFunction: isFunction,
- isString: isString,
- isObject: isObject,
- isBoolean: isBoolean,
- isArray: isArray,
- isJson: isJson,
- isIBAN: isIBAN
- };
- },{"bignumber.js":"bignumber.js"}],8:[function(require,module,exports){
- module.exports={
- "version": "0.9.1"
- }
- },{}],9:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /** @file web3.js
- * @authors:
- * Jeffrey Wilcke <jeff@ethdev.com>
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * Fabian Vogelsteller <fabian@ethdev.com>
- * Gav Wood <g@ethdev.com>
- * @date 2014
- */
- var version = require('./version.json');
- var net = require('./web3/net');
- var eth = require('./web3/eth');
- var db = require('./web3/db');
- var shh = require('./web3/shh');
- var watches = require('./web3/watches');
- var Filter = require('./web3/filter');
- var utils = require('./utils/utils');
- var formatters = require('./web3/formatters');
- var RequestManager = require('./web3/requestmanager');
- var c = require('./utils/config');
- var Property = require('./web3/property');
- var Batch = require('./web3/batch');
- var sha3 = require('./utils/sha3');
- var web3Properties = [
- new Property({
- name: 'version.client',
- getter: 'web3_clientVersion'
- }),
- new Property({
- name: 'version.network',
- getter: 'net_version',
- inputFormatter: utils.toDecimal
- }),
- new Property({
- name: 'version.ethereum',
- getter: 'eth_protocolVersion',
- inputFormatter: utils.toDecimal
- }),
- new Property({
- name: 'version.whisper',
- getter: 'shh_version',
- inputFormatter: utils.toDecimal
- })
- ];
- /// creates methods in a given object based on method description on input
- /// setups api calls for these methods
- var setupMethods = function (obj, methods) {
- methods.forEach(function (method) {
- method.attachToObject(obj);
- });
- };
- /// creates properties in a given object based on properties description on input
- /// setups api calls for these properties
- var setupProperties = function (obj, properties) {
- properties.forEach(function (property) {
- property.attachToObject(obj);
- });
- };
- /// setups web3 object, and it's in-browser executed methods
- var web3 = {};
- web3.providers = {};
- web3.currentProvider = null;
- web3.version = {};
- web3.version.api = version.version;
- web3.eth = {};
- /*jshint maxparams:4 */
- web3.eth.filter = function (fil, callback) {
- return new Filter(fil, watches.eth(), formatters.outputLogFormatter, callback);
- };
- /*jshint maxparams:3 */
- web3.shh = {};
- web3.shh.filter = function (fil, callback) {
- return new Filter(fil, watches.shh(), formatters.outputPostFormatter, callback);
- };
- web3.net = {};
- web3.db = {};
- web3.setProvider = function (provider) {
- this.currentProvider = provider;
- RequestManager.getInstance().setProvider(provider);
- };
- web3.isConnected = function(){
- return (this.currentProvider && this.currentProvider.isConnected());
- };
- web3.reset = function () {
- RequestManager.getInstance().reset();
- c.defaultBlock = 'latest';
- c.defaultAccount = undefined;
- };
- web3.toHex = utils.toHex;
- web3.toAscii = utils.toAscii;
- web3.fromAscii = utils.fromAscii;
- web3.toDecimal = utils.toDecimal;
- web3.fromDecimal = utils.fromDecimal;
- web3.toBigNumber = utils.toBigNumber;
- web3.toWei = utils.toWei;
- web3.fromWei = utils.fromWei;
- web3.isAddress = utils.isAddress;
- web3.isIBAN = utils.isIBAN;
- web3.sha3 = sha3;
- web3.createBatch = function () {
- return new Batch();
- };
- // ADD defaultblock
- Object.defineProperty(web3.eth, 'defaultBlock', {
- get: function () {
- return c.defaultBlock;
- },
- set: function (val) {
- c.defaultBlock = val;
- return val;
- }
- });
- Object.defineProperty(web3.eth, 'defaultAccount', {
- get: function () {
- return c.defaultAccount;
- },
- set: function (val) {
- c.defaultAccount = val;
- return val;
- }
- });
- // EXTEND
- web3._extend = function(extension){
- /*jshint maxcomplexity: 6 */
- if(extension.property && !web3[extension.property])
- web3[extension.property] = {};
- setupMethods(web3[extension.property] || web3, extension.methods || []);
- setupProperties(web3[extension.property] || web3, extension.properties || []);
- };
- web3._extend.formatters = formatters;
- web3._extend.utils = utils;
- web3._extend.Method = require('./web3/method');
- web3._extend.Property = require('./web3/property');
- /// setups all api methods
- setupProperties(web3, web3Properties);
- setupMethods(web3.net, net.methods);
- setupProperties(web3.net, net.properties);
- setupMethods(web3.eth, eth.methods);
- setupProperties(web3.eth, eth.properties);
- setupMethods(web3.db, db.methods);
- setupMethods(web3.shh, shh.methods);
- module.exports = web3;
- },{"./utils/config":5,"./utils/sha3":6,"./utils/utils":7,"./version.json":8,"./web3/batch":11,"./web3/db":13,"./web3/eth":15,"./web3/filter":17,"./web3/formatters":18,"./web3/method":24,"./web3/net":26,"./web3/property":27,"./web3/requestmanager":28,"./web3/shh":29,"./web3/watches":31}],10:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file allevents.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2014
- */
- var sha3 = require('../utils/sha3');
- var SolidityEvent = require('./event');
- var formatters = require('./formatters');
- var utils = require('../utils/utils');
- var Filter = require('./filter');
- var watches = require('./watches');
- var AllSolidityEvents = function (json, address) {
- this._json = json;
- this._address = address;
- };
- AllSolidityEvents.prototype.encode = function (options) {
- options = options || {};
- var result = {};
- ['fromBlock', 'toBlock'].filter(function (f) {
- return options[f] !== undefined;
- }).forEach(function (f) {
- result[f] = formatters.inputBlockNumberFormatter(options[f]);
- });
- result.address = this._address;
- return result;
- };
- AllSolidityEvents.prototype.decode = function (data) {
- data.data = data.data || '';
- data.topics = data.topics || [];
- var eventTopic = data.topics[0].slice(2);
- var match = this._json.filter(function (j) {
- return eventTopic === sha3(utils.transformToFullName(j));
- })[0];
- if (!match) { // cannot find matching event?
- console.warn('cannot find event for log');
- return data;
- }
- var event = new SolidityEvent(match, this._address);
- return event.decode(data);
- };
- AllSolidityEvents.prototype.execute = function (options, callback) {
- var o = this.encode(options);
- var formatter = this.decode.bind(this);
- return new Filter(o, watches.eth(), formatter, callback);
- };
- AllSolidityEvents.prototype.attachToContract = function (contract) {
- var execute = this.execute.bind(this);
- contract.allEvents = execute;
- };
- module.exports = AllSolidityEvents;
- },{"../utils/sha3":6,"../utils/utils":7,"./event":16,"./filter":17,"./formatters":18,"./watches":31}],11:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file batch.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var RequestManager = require('./requestmanager');
- var Jsonrpc = require('./jsonrpc');
- var errors = require('./errors');
- var Batch = function () {
- this.requests = [];
- };
- /**
- * Should be called to add create new request to batch request
- *
- * @method add
- * @param {Object} jsonrpc requet object
- */
- Batch.prototype.add = function (request) {
- this.requests.push(request);
- };
- /**
- * Should be called to execute batch request
- *
- * @method execute
- */
- Batch.prototype.execute = function () {
- var requests = this.requests;
- RequestManager.getInstance().sendBatch(requests, function (err, results) {
- results = results || [];
- requests.map(function (request, index) {
- return results[index] || {};
- }).forEach(function (result, index) {
- if (requests[index].callback) {
- if (!Jsonrpc.getInstance().isValidResponse(result)) {
- return requests[index].callback(errors.InvalidResponse(result));
- }
- requests[index].callback(null, (requests[index].format ? requests[index].format(result.result) : result.result));
- }
- });
- });
- };
- module.exports = Batch;
- },{"./errors":14,"./jsonrpc":23,"./requestmanager":28}],12:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file contract.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2014
- */
- var web3 = require('../web3');
- var utils = require('../utils/utils');
- var coder = require('../solidity/coder');
- var SolidityEvent = require('./event');
- var SolidityFunction = require('./function');
- var AllEvents = require('./allevents');
- /**
- * Should be called to encode constructor params
- *
- * @method encodeConstructorParams
- * @param {Array} abi
- * @param {Array} constructor params
- */
- var encodeConstructorParams = function (abi, params) {
- return abi.filter(function (json) {
- return json.type === 'constructor' && json.inputs.length === params.length;
- }).map(function (json) {
- return json.inputs.map(function (input) {
- return input.type;
- });
- }).map(function (types) {
- return coder.encodeParams(types, params);
- })[0] || '';
- };
- /**
- * Should be called to add functions to contract object
- *
- * @method addFunctionsToContract
- * @param {Contract} contract
- * @param {Array} abi
- */
- var addFunctionsToContract = function (contract, abi) {
- abi.filter(function (json) {
- return json.type === 'function';
- }).map(function (json) {
- return new SolidityFunction(json, contract.address);
- }).forEach(function (f) {
- f.attachToContract(contract);
- });
- };
- /**
- * Should be called to add events to contract object
- *
- * @method addEventsToContract
- * @param {Contract} contract
- * @param {Array} abi
- */
- var addEventsToContract = function (contract, abi) {
- var events = abi.filter(function (json) {
- return json.type === 'event';
- });
- var All = new AllEvents(events, contract.address);
- All.attachToContract(contract);
-
- events.map(function (json) {
- return new SolidityEvent(json, contract.address);
- }).forEach(function (e) {
- e.attachToContract(contract);
- });
- };
- /**
- * Should be called to create new ContractFactory
- *
- * @method contract
- * @param {Array} abi
- * @returns {ContractFactory} new contract factory
- */
- var contract = function (abi) {
- return new ContractFactory(abi);
- };
- /**
- * Should be called to check if the contract gets properly deployed on the blockchain.
- *
- * @method checkForContractAddress
- * @param {Object} contract
- * @param {Function} callback
- * @returns {Undefined}
- */
- var checkForContractAddress = function(contract, abi, callback){
- var count = 0,
- callbackFired = false;
- // wait for receipt
- var filter = web3.eth.filter('latest', function(e){
- if(!e && !callbackFired) {
- count++;
- // console.log('Checking for contract address', count);
- // stop watching after 50 blocks (timeout)
- if(count > 50) {
-
- filter.stopWatching();
- callbackFired = true;
- if(callback)
- callback(new Error('Contract transaction couldn\'t be found after 50 blocks'));
- else
- throw new Error('Contract transaction couldn\'t be found after 50 blocks');
- } else {
- web3.eth.getTransactionReceipt(contract.transactionHash, function(e, receipt){
- if(receipt && !callbackFired) {
- web3.eth.getCode(receipt.contractAddress, function(e, code){
- /*jshint maxcomplexity: 5 */
- if(callbackFired)
- return;
-
- filter.stopWatching();
- callbackFired = true;
- if(code.length > 2) {
- // console.log('Contract code deployed!');
- contract.address = receipt.contractAddress;
- // attach events and methods
- addFunctionsToContract(contract, abi);
- addEventsToContract(contract, abi);
- // call callback for the second time
- if(callback)
- callback(null, contract);
- } else {
- if(callback)
- callback(new Error('The contract code couldn\'t be stored, please check your gas amount.'));
- else
- throw new Error('The contract code couldn\'t be stored, please check your gas amount.');
- }
- });
- }
- });
- }
- }
- });
- };
- /**
- * Should be called to create new ContractFactory instance
- *
- * @method ContractFactory
- * @param {Array} abi
- */
- var ContractFactory = function (abi) {
- this.abi = abi;
- };
- /**
- * Should be called to create new contract on a blockchain
- *
- * @method new
- * @param {Any} contract constructor param1 (optional)
- * @param {Any} contract constructor param2 (optional)
- * @param {Object} contract transaction object (required)
- * @param {Function} callback
- * @returns {Contract} returns contract instance
- */
- ContractFactory.prototype.new = function () {
- var _this = this;
- var contract = new Contract(this.abi);
- // parse arguments
- var options = {}; // required!
- var callback;
- var args = Array.prototype.slice.call(arguments);
- if (utils.isFunction(args[args.length - 1])) {
- callback = args.pop();
- }
- var last = args[args.length - 1];
- if (utils.isObject(last) && !utils.isArray(last)) {
- options = args.pop();
- }
- // throw an error if there are no options
- var bytes = encodeConstructorParams(this.abi, args);
- options.data += bytes;
- if(callback) {
- // wait for the contract address adn check if the code was deployed
- web3.eth.sendTransaction(options, function (err, hash) {
- if (err) {
- callback(err);
- } else {
- // add the transaction hash
- contract.transactionHash = hash;
- // call callback for the first time
- callback(null, contract);
- checkForContractAddress(contract, _this.abi, callback);
- }
- });
- } else {
- var hash = web3.eth.sendTransaction(options);
- // add the transaction hash
- contract.transactionHash = hash;
- checkForContractAddress(contract, _this.abi);
- }
- return contract;
- };
- /**
- * Should be called to get access to existing contract on a blockchain
- *
- * @method at
- * @param {Address} contract address (required)
- * @param {Function} callback {optional)
- * @returns {Contract} returns contract if no callback was passed,
- * otherwise calls callback function (err, contract)
- */
- ContractFactory.prototype.at = function (address, callback) {
- var contract = new Contract(this.abi, address);
- // TODO: address is required
- // attach functions
- addFunctionsToContract(contract, this.abi);
- addEventsToContract(contract, this.abi);
-
- if (callback) {
- callback(null, contract);
- }
- return contract;
- };
- /**
- * Should be called to create new contract instance
- *
- * @method Contract
- * @param {Array} abi
- * @param {Address} contract address
- */
- var Contract = function (abi, address) {
- this.address = address;
- };
- module.exports = contract;
- },{"../solidity/coder":1,"../utils/utils":7,"../web3":9,"./allevents":10,"./event":16,"./function":19}],13:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /** @file db.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var Method = require('./method');
- var putString = new Method({
- name: 'putString',
- call: 'db_putString',
- params: 3
- });
- var getString = new Method({
- name: 'getString',
- call: 'db_getString',
- params: 2
- });
- var putHex = new Method({
- name: 'putHex',
- call: 'db_putHex',
- params: 3
- });
- var getHex = new Method({
- name: 'getHex',
- call: 'db_getHex',
- params: 2
- });
- var methods = [
- putString, getString, putHex, getHex
- ];
- module.exports = {
- methods: methods
- };
- },{"./method":24}],14:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file errors.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- module.exports = {
- InvalidNumberOfParams: function () {
- return new Error('Invalid number of input parameters');
- },
- InvalidConnection: function (host){
- return new Error('CONNECTION ERROR: Couldn\'t connect to node '+ host +', is it running?');
- },
- InvalidProvider: function () {
- return new Error('Providor not set or invalid');
- },
- InvalidResponse: function (result){
- var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response: '+ result;
- return new Error(message);
- }
- };
- },{}],15:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file eth.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @author Fabian Vogelsteller <fabian@ethdev.com>
- * @date 2015
- */
- /**
- * Web3
- *
- * @module web3
- */
- /**
- * Eth methods and properties
- *
- * An example method object can look as follows:
- *
- * {
- * name: 'getBlock',
- * call: blockCall,
- * params: 2,
- * outputFormatter: formatters.outputBlockFormatter,
- * inputFormatter: [ // can be a formatter funciton or an array of functions. Where each item in the array will be used for one parameter
- * utils.toHex, // formats paramter 1
- * function(param){ return !!param; } // formats paramter 2
- * ]
- * },
- *
- * @class [web3] eth
- * @constructor
- */
- "use strict";
- var formatters = require('./formatters');
- var utils = require('../utils/utils');
- var Method = require('./method');
- var Property = require('./property');
- var blockCall = function (args) {
- return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "eth_getBlockByHash" : "eth_getBlockByNumber";
- };
- var transactionFromBlockCall = function (args) {
- return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex';
- };
- var uncleCall = function (args) {
- return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex';
- };
- var getBlockTransactionCountCall = function (args) {
- return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber';
- };
- var uncleCountCall = function (args) {
- return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber';
- };
- /// @returns an array of objects describing web3.eth api methods
- var getBalance = new Method({
- name: 'getBalance',
- call: 'eth_getBalance',
- params: 2,
- inputFormatter: [utils.toAddress, formatters.inputDefaultBlockNumberFormatter],
- outputFormatter: formatters.outputBigNumberFormatter
- });
- var getStorageAt = new Method({
- name: 'getStorageAt',
- call: 'eth_getStorageAt',
- params: 3,
- inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter]
- });
- var getCode = new Method({
- name: 'getCode',
- call: 'eth_getCode',
- params: 2,
- inputFormatter: [utils.toAddress, formatters.inputDefaultBlockNumberFormatter]
- });
- var getBlock = new Method({
- name: 'getBlock',
- call: blockCall,
- params: 2,
- inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { return !!val; }],
- outputFormatter: formatters.outputBlockFormatter
- });
- var getUncle = new Method({
- name: 'getUncle',
- call: uncleCall,
- params: 2,
- inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],
- outputFormatter: formatters.outputBlockFormatter,
- });
- var getCompilers = new Method({
- name: 'getCompilers',
- call: 'eth_getCompilers',
- params: 0
- });
- var getBlockTransactionCount = new Method({
- name: 'getBlockTransactionCount',
- call: getBlockTransactionCountCall,
- params: 1,
- inputFormatter: [formatters.inputBlockNumberFormatter],
- outputFormatter: utils.toDecimal
- });
- var getBlockUncleCount = new Method({
- name: 'getBlockUncleCount',
- call: uncleCountCall,
- params: 1,
- inputFormatter: [formatters.inputBlockNumberFormatter],
- outputFormatter: utils.toDecimal
- });
- var getTransaction = new Method({
- name: 'getTransaction',
- call: 'eth_getTransactionByHash',
- params: 1,
- outputFormatter: formatters.outputTransactionFormatter
- });
- var getTransactionFromBlock = new Method({
- name: 'getTransactionFromBlock',
- call: transactionFromBlockCall,
- params: 2,
- inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],
- outputFormatter: formatters.outputTransactionFormatter
- });
- var getTransactionReceipt = new Method({
- name: 'getTransactionReceipt',
- call: 'eth_getTransactionReceipt',
- params: 1,
- outputFormatter: formatters.outputTransactionReceiptFormatter
- });
- var getTransactionCount = new Method({
- name: 'getTransactionCount',
- call: 'eth_getTransactionCount',
- params: 2,
- inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter],
- outputFormatter: utils.toDecimal
- });
- var sendRawTransaction = new Method({
- name: 'sendRawTransaction',
- call: 'eth_sendRawTransaction',
- params: 1,
- inputFormatter: [null]
- });
- var sendTransaction = new Method({
- name: 'sendTransaction',
- call: 'eth_sendTransaction',
- params: 1,
- inputFormatter: [formatters.inputTransactionFormatter]
- });
- var call = new Method({
- name: 'call',
- call: 'eth_call',
- params: 2,
- inputFormatter: [formatters.inputTransactionFormatter, formatters.inputDefaultBlockNumberFormatter]
- });
- var estimateGas = new Method({
- name: 'estimateGas',
- call: 'eth_estimateGas',
- params: 1,
- inputFormatter: [formatters.inputTransactionFormatter],
- outputFormatter: utils.toDecimal
- });
- var compileSolidity = new Method({
- name: 'compile.solidity',
- call: 'eth_compileSolidity',
- params: 1
- });
- var compileLLL = new Method({
- name: 'compile.lll',
- call: 'eth_compileLLL',
- params: 1
- });
- var compileSerpent = new Method({
- name: 'compile.serpent',
- call: 'eth_compileSerpent',
- params: 1
- });
- var submitWork = new Method({
- name: 'submitWork',
- call: 'eth_submitWork',
- params: 3
- });
- var getWork = new Method({
- name: 'getWork',
- call: 'eth_getWork',
- params: 0
- });
- var methods = [
- getBalance,
- getStorageAt,
- getCode,
- getBlock,
- getUncle,
- getCompilers,
- getBlockTransactionCount,
- getBlockUncleCount,
- getTransaction,
- getTransactionFromBlock,
- getTransactionReceipt,
- getTransactionCount,
- call,
- estimateGas,
- sendRawTransaction,
- sendTransaction,
- compileSolidity,
- compileLLL,
- compileSerpent,
- submitWork,
- getWork
- ];
- /// @returns an array of objects describing web3.eth api properties
- var properties = [
- new Property({
- name: 'coinbase',
- getter: 'eth_coinbase'
- }),
- new Property({
- name: 'mining',
- getter: 'eth_mining'
- }),
- new Property({
- name: 'hashrate',
- getter: 'eth_hashrate',
- outputFormatter: utils.toDecimal
- }),
- new Property({
- name: 'gasPrice',
- getter: 'eth_gasPrice',
- outputFormatter: formatters.outputBigNumberFormatter
- }),
- new Property({
- name: 'accounts',
- getter: 'eth_accounts'
- }),
- new Property({
- name: 'blockNumber',
- getter: 'eth_blockNumber',
- outputFormatter: utils.toDecimal
- })
- ];
- module.exports = {
- methods: methods,
- properties: properties
- };
- },{"../utils/utils":7,"./formatters":18,"./method":24,"./property":27}],16:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file event.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2014
- */
- var utils = require('../utils/utils');
- var coder = require('../solidity/coder');
- var formatters = require('./formatters');
- var sha3 = require('../utils/sha3');
- var Filter = require('./filter');
- var watches = require('./watches');
- /**
- * This prototype should be used to create event filters
- */
- var SolidityEvent = function (json, address) {
- this._params = json.inputs;
- this._name = utils.transformToFullName(json);
- this._address = address;
- this._anonymous = json.anonymous;
- };
- /**
- * Should be used to get filtered param types
- *
- * @method types
- * @param {Bool} decide if returned typed should be indexed
- * @return {Array} array of types
- */
- SolidityEvent.prototype.types = function (indexed) {
- return this._params.filter(function (i) {
- return i.indexed === indexed;
- }).map(function (i) {
- return i.type;
- });
- };
- /**
- * Should be used to get event display name
- *
- * @method displayName
- * @return {String} event display name
- */
- SolidityEvent.prototype.displayName = function () {
- return utils.extractDisplayName(this._name);
- };
- /**
- * Should be used to get event type name
- *
- * @method typeName
- * @return {String} event type name
- */
- SolidityEvent.prototype.typeName = function () {
- return utils.extractTypeName(this._name);
- };
- /**
- * Should be used to get event signature
- *
- * @method signature
- * @return {String} event signature
- */
- SolidityEvent.prototype.signature = function () {
- return sha3(this._name);
- };
- /**
- * Should be used to encode indexed params and options to one final object
- *
- * @method encode
- * @param {Object} indexed
- * @param {Object} options
- * @return {Object} everything combined together and encoded
- */
- SolidityEvent.prototype.encode = function (indexed, options) {
- indexed = indexed || {};
- options = options || {};
- var result = {};
- ['fromBlock', 'toBlock'].filter(function (f) {
- return options[f] !== undefined;
- }).forEach(function (f) {
- result[f] = formatters.inputBlockNumberFormatter(options[f]);
- });
- result.topics = [];
- result.address = this._address;
- if (!this._anonymous) {
- result.topics.push('0x' + this.signature());
- }
- var indexedTopics = this._params.filter(function (i) {
- return i.indexed === true;
- }).map(function (i) {
- var value = indexed[i.name];
- if (value === undefined || value === null) {
- return null;
- }
-
- if (utils.isArray(value)) {
- return value.map(function (v) {
- return '0x' + coder.encodeParam(i.type, v);
- });
- }
- return '0x' + coder.encodeParam(i.type, value);
- });
- result.topics = result.topics.concat(indexedTopics);
- return result;
- };
- /**
- * Should be used to decode indexed params and options
- *
- * @method decode
- * @param {Object} data
- * @return {Object} result object with decoded indexed && not indexed params
- */
- SolidityEvent.prototype.decode = function (data) {
-
- data.data = data.data || '';
- data.topics = data.topics || [];
- var argTopics = this._anonymous ? data.topics : data.topics.slice(1);
- var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join("");
- var indexedParams = coder.decodeParams(this.types(true), indexedData);
- var notIndexedData = data.data.slice(2);
- var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData);
-
- var result = formatters.outputLogFormatter(data);
- result.event = this.displayName();
- result.address = data.address;
- result.args = this._params.reduce(function (acc, current) {
- acc[current.name] = current.indexed ? indexedParams.shift() : notIndexedParams.shift();
- return acc;
- }, {});
- delete result.data;
- delete result.topics;
- return result;
- };
- /**
- * Should be used to create new filter object from event
- *
- * @method execute
- * @param {Object} indexed
- * @param {Object} options
- * @return {Object} filter object
- */
- SolidityEvent.prototype.execute = function (indexed, options, callback) {
- if (utils.isFunction(arguments[arguments.length - 1])) {
- callback = arguments[arguments.length - 1];
- if(arguments.length === 2)
- options = null;
- if(arguments.length === 1) {
- options = null;
- indexed = {};
- }
- }
-
- var o = this.encode(indexed, options);
- var formatter = this.decode.bind(this);
- return new Filter(o, watches.eth(), formatter, callback);
- };
- /**
- * Should be used to attach event to contract object
- *
- * @method attachToContract
- * @param {Contract}
- */
- SolidityEvent.prototype.attachToContract = function (contract) {
- var execute = this.execute.bind(this);
- var displayName = this.displayName();
- if (!contract[displayName]) {
- contract[displayName] = execute;
- }
- contract[displayName][this.typeName()] = this.execute.bind(this, contract);
- };
- module.exports = SolidityEvent;
- },{"../solidity/coder":1,"../utils/sha3":6,"../utils/utils":7,"./filter":17,"./formatters":18,"./watches":31}],17:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /** @file filter.js
- * @authors:
- * Jeffrey Wilcke <jeff@ethdev.com>
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * Fabian Vogelsteller <fabian@ethdev.com>
- * Gav Wood <g@ethdev.com>
- * @date 2014
- */
- var RequestManager = require('./requestmanager');
- var formatters = require('./formatters');
- var utils = require('../utils/utils');
- /**
- * Converts a given topic to a hex string, but also allows null values.
- *
- * @param {Mixed} value
- * @return {String}
- */
- var toTopic = function(value){
- if(value === null || typeof value === 'undefined')
- return null;
- value = String(value);
- if(value.indexOf('0x') === 0)
- return value;
- else
- return utils.fromAscii(value);
- };
- /// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones
- /// @param should be string or object
- /// @returns options string or object
- var getOptions = function (options) {
- if (utils.isString(options)) {
- return options;
- }
- options = options || {};
- // make sure topics, get converted to hex
- options.topics = options.topics || [];
- options.topics = options.topics.map(function(topic){
- return (utils.isArray(topic)) ? topic.map(toTopic) : toTopic(topic);
- });
- // lazy load
- return {
- topics: options.topics,
- to: options.to,
- address: options.address,
- fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock),
- toBlock: formatters.inputBlockNumberFormatter(options.toBlock)
- };
- };
- /**
- Adds the callback and sets up the methods, to iterate over the results.
- @method getLogsAtStart
- @param {Object} self
- @param {funciton}
- */
- var getLogsAtStart = function(self, callback){
- // call getFilterLogs for the first watch callback start
- if (!utils.isString(self.options)) {
- self.get(function (err, messages) {
- // don't send all the responses to all the watches again... just to self one
- if (err) {
- callback(err);
- }
- if(utils.isArray(messages)) {
- messages.forEach(function (message) {
- callback(null, message);
- });
- }
- });
- }
- };
- /**
- Adds the callback and sets up the methods, to iterate over the results.
- @method pollFilter
- @param {Object} self
- */
- var pollFilter = function(self) {
- var onMessage = function (error, messages) {
- if (error) {
- return self.callbacks.forEach(function (callback) {
- callback(error);
- });
- }
- messages.forEach(function (message) {
- message = self.formatter ? self.formatter(message) : message;
- self.callbacks.forEach(function (callback) {
- callback(null, message);
- });
- });
- };
- RequestManager.getInstance().startPolling({
- method: self.implementation.poll.call,
- params: [self.filterId],
- }, self.filterId, onMessage, self.stopWatching.bind(self));
- };
- var Filter = function (options, methods, formatter, callback) {
- var self = this;
- var implementation = {};
- methods.forEach(function (method) {
- method.attachToObject(implementation);
- });
- this.options = getOptions(options);
- this.implementation = implementation;
- this.filterId = null;
- this.callbacks = [];
- this.pollFilters = [];
- this.formatter = formatter;
- this.implementation.newFilter(this.options, function(error, id){
- if(error) {
- self.callbacks.forEach(function(cb){
- cb(error);
- });
- } else {
- self.filterId = id;
- // get filter logs for the already existing watch calls
- self.callbacks.forEach(function(cb){
- getLogsAtStart(self, cb);
- });
- if(self.callbacks.length > 0)
- pollFilter(self);
- // start to watch immediately
- if(callback) {
- return self.watch(callback);
- }
- }
- });
- };
- Filter.prototype.watch = function (callback) {
- this.callbacks.push(callback);
- if(this.filterId) {
- getLogsAtStart(this, callback);
- pollFilter(this);
- }
- return this;
- };
- Filter.prototype.stopWatching = function () {
- RequestManager.getInstance().stopPolling(this.filterId);
- // remove filter async
- this.implementation.uninstallFilter(this.filterId, function(){});
- this.callbacks = [];
- };
- Filter.prototype.get = function (callback) {
- var self = this;
- if (utils.isFunction(callback)) {
- this.implementation.getLogs(this.filterId, function(err, res){
- if (err) {
- callback(err);
- } else {
- callback(null, res.map(function (log) {
- return self.formatter ? self.formatter(log) : log;
- }));
- }
- });
- } else {
- var logs = this.implementation.getLogs(this.filterId);
- return logs.map(function (log) {
- return self.formatter ? self.formatter(log) : log;
- });
- }
- return this;
- };
- module.exports = Filter;
- },{"../utils/utils":7,"./formatters":18,"./requestmanager":28}],18:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file formatters.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @author Fabian Vogelsteller <fabian@ethdev.com>
- * @date 2015
- */
- var utils = require('../utils/utils');
- var config = require('../utils/config');
- /**
- * Should the format output to a big number
- *
- * @method outputBigNumberFormatter
- * @param {String|Number|BigNumber}
- * @returns {BigNumber} object
- */
- var outputBigNumberFormatter = function (number) {
- return utils.toBigNumber(number);
- };
- var isPredefinedBlockNumber = function (blockNumber) {
- return blockNumber === 'latest' || blockNumber === 'pending' || blockNumber === 'earliest';
- };
- var inputDefaultBlockNumberFormatter = function (blockNumber) {
- if (blockNumber === undefined) {
- return config.defaultBlock;
- }
- return inputBlockNumberFormatter(blockNumber);
- };
- var inputBlockNumberFormatter = function (blockNumber) {
- if (blockNumber === undefined) {
- return undefined;
- } else if (isPredefinedBlockNumber(blockNumber)) {
- return blockNumber;
- }
- return utils.toHex(blockNumber);
- };
- /**
- * Formats the input of a transaction and converts all values to HEX
- *
- * @method inputTransactionFormatter
- * @param {Object} transaction options
- * @returns object
- */
- var inputTransactionFormatter = function (options){
- options.from = options.from || config.defaultAccount;
- // make code -> data
- if (options.code) {
- options.data = options.code;
- delete options.code;
- }
- ['gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {
- return options[key] !== undefined;
- }).forEach(function(key){
- options[key] = utils.fromDecimal(options[key]);
- });
- return options;
- };
- /**
- * Formats the output of a transaction to its proper values
- *
- * @method outputTransactionFormatter
- * @param {Object} tx
- * @returns {Object}
- */
- var outputTransactionFormatter = function (tx){
- if(tx.blockNumber !== null)
- tx.blockNumber = utils.toDecimal(tx.blockNumber);
- if(tx.transactionIndex !== null)
- tx.transactionIndex = utils.toDecimal(tx.transactionIndex);
- tx.nonce = utils.toDecimal(tx.nonce);
- tx.gas = utils.toDecimal(tx.gas);
- tx.gasPrice = utils.toBigNumber(tx.gasPrice);
- tx.value = utils.toBigNumber(tx.value);
- return tx;
- };
- /**
- * Formats the output of a transaction receipt to its proper values
- *
- * @method outputTransactionReceiptFormatter
- * @param {Object} receipt
- * @returns {Object}
- */
- var outputTransactionReceiptFormatter = function (receipt){
- if(receipt.blockNumber !== null)
- receipt.blockNumber = utils.toDecimal(receipt.blockNumber);
- if(receipt.transactionIndex !== null)
- receipt.transactionIndex = utils.toDecimal(receipt.transactionIndex);
- receipt.cumulativeGasUsed = utils.toDecimal(receipt.cumulativeGasUsed);
- receipt.gasUsed = utils.toDecimal(receipt.gasUsed);
- if(utils.isArray(receipt.logs)) {
- receipt.logs = receipt.logs.map(function(log){
- return outputLogFormatter(log);
- });
- }
- return receipt;
- };
- /**
- * Formats the output of a block to its proper values
- *
- * @method outputBlockFormatter
- * @param {Object} block
- * @returns {Object}
- */
- var outputBlockFormatter = function(block) {
- // transform to number
- block.gasLimit = utils.toDecimal(block.gasLimit);
- block.gasUsed = utils.toDecimal(block.gasUsed);
- block.size = utils.toDecimal(block.size);
- block.timestamp = utils.toDecimal(block.timestamp);
- if(block.number !== null)
- block.number = utils.toDecimal(block.number);
- block.difficulty = utils.toBigNumber(block.difficulty);
- block.totalDifficulty = utils.toBigNumber(block.totalDifficulty);
- if (utils.isArray(block.transactions)) {
- block.transactions.forEach(function(item){
- if(!utils.isString(item))
- return outputTransactionFormatter(item);
- });
- }
- return block;
- };
- /**
- * Formats the output of a log
- *
- * @method outputLogFormatter
- * @param {Object} log object
- * @returns {Object} log
- */
- var outputLogFormatter = function(log) {
- if(log.blockNumber !== null)
- log.blockNumber = utils.toDecimal(log.blockNumber);
- if(log.transactionIndex !== null)
- log.transactionIndex = utils.toDecimal(log.transactionIndex);
- if(log.logIndex !== null)
- log.logIndex = utils.toDecimal(log.logIndex);
- return log;
- };
- /**
- * Formats the input of a whisper post and converts all values to HEX
- *
- * @method inputPostFormatter
- * @param {Object} transaction object
- * @returns {Object}
- */
- var inputPostFormatter = function(post) {
- post.payload = utils.toHex(post.payload);
- post.ttl = utils.fromDecimal(post.ttl);
- post.workToProve = utils.fromDecimal(post.workToProve);
- post.priority = utils.fromDecimal(post.priority);
- // fallback
- if (!utils.isArray(post.topics)) {
- post.topics = post.topics ? [post.topics] : [];
- }
- // format the following options
- post.topics = post.topics.map(function(topic){
- return utils.fromAscii(topic);
- });
- return post;
- };
- /**
- * Formats the output of a received post message
- *
- * @method outputPostFormatter
- * @param {Object}
- * @returns {Object}
- */
- var outputPostFormatter = function(post){
- post.expiry = utils.toDecimal(post.expiry);
- post.sent = utils.toDecimal(post.sent);
- post.ttl = utils.toDecimal(post.ttl);
- post.workProved = utils.toDecimal(post.workProved);
- post.payloadRaw = post.payload;
- post.payload = utils.toAscii(post.payload);
- if (utils.isJson(post.payload)) {
- post.payload = JSON.parse(post.payload);
- }
- // format the following options
- if (!post.topics) {
- post.topics = [];
- }
- post.topics = post.topics.map(function(topic){
- return utils.toAscii(topic);
- });
- return post;
- };
- module.exports = {
- inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter,
- inputBlockNumberFormatter: inputBlockNumberFormatter,
- inputTransactionFormatter: inputTransactionFormatter,
- inputPostFormatter: inputPostFormatter,
- outputBigNumberFormatter: outputBigNumberFormatter,
- outputTransactionFormatter: outputTransactionFormatter,
- outputTransactionReceiptFormatter: outputTransactionReceiptFormatter,
- outputBlockFormatter: outputBlockFormatter,
- outputLogFormatter: outputLogFormatter,
- outputPostFormatter: outputPostFormatter
- };
- },{"../utils/config":5,"../utils/utils":7}],19:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file function.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var web3 = require('../web3');
- var coder = require('../solidity/coder');
- var utils = require('../utils/utils');
- var formatters = require('./formatters');
- var sha3 = require('../utils/sha3');
- /**
- * This prototype should be used to call/sendTransaction to solidity functions
- */
- var SolidityFunction = function (json, address) {
- this._inputTypes = json.inputs.map(function (i) {
- return i.type;
- });
- this._outputTypes = json.outputs.map(function (i) {
- return i.type;
- });
- this._constant = json.constant;
- this._name = utils.transformToFullName(json);
- this._address = address;
- };
- SolidityFunction.prototype.extractCallback = function (args) {
- if (utils.isFunction(args[args.length - 1])) {
- return args.pop(); // modify the args array!
- }
- };
- SolidityFunction.prototype.extractDefaultBlock = function (args) {
- if (args.length > this._inputTypes.length && !utils.isObject(args[args.length -1])) {
- return formatters.inputDefaultBlockNumberFormatter(args.pop()); // modify the args array!
- }
- };
- /**
- * Should be used to create payload from arguments
- *
- * @method toPayload
- * @param {Array} solidity function params
- * @param {Object} optional payload options
- */
- SolidityFunction.prototype.toPayload = function (args) {
- var options = {};
- if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) {
- options = args[args.length - 1];
- }
- options.to = this._address;
- options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args);
- return options;
- };
- /**
- * Should be used to get function signature
- *
- * @method signature
- * @return {String} function signature
- */
- SolidityFunction.prototype.signature = function () {
- return sha3(this._name).slice(0, 8);
- };
- SolidityFunction.prototype.unpackOutput = function (output) {
- if (!output) {
- return;
- }
- output = output.length >= 2 ? output.slice(2) : output;
- var result = coder.decodeParams(this._outputTypes, output);
- return result.length === 1 ? result[0] : result;
- };
- /**
- * Calls a contract function.
- *
- * @method call
- * @param {...Object} Contract function arguments
- * @param {function} If the last argument is a function, the contract function
- * call will be asynchronous, and the callback will be passed the
- * error and result.
- * @return {String} output bytes
- */
- SolidityFunction.prototype.call = function () {
- var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
- var callback = this.extractCallback(args);
- var defaultBlock = this.extractDefaultBlock(args);
- var payload = this.toPayload(args);
- if (!callback) {
- var output = web3.eth.call(payload, defaultBlock);
- return this.unpackOutput(output);
- }
-
- var self = this;
- web3.eth.call(payload, defaultBlock, function (error, output) {
- callback(error, self.unpackOutput(output));
- });
- };
- /**
- * Should be used to sendTransaction to solidity function
- *
- * @method sendTransaction
- * @param {Object} options
- */
- SolidityFunction.prototype.sendTransaction = function () {
- var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
- var callback = this.extractCallback(args);
- var payload = this.toPayload(args);
- if (!callback) {
- return web3.eth.sendTransaction(payload);
- }
- web3.eth.sendTransaction(payload, callback);
- };
- /**
- * Should be used to estimateGas of solidity function
- *
- * @method estimateGas
- * @param {Object} options
- */
- SolidityFunction.prototype.estimateGas = function () {
- var args = Array.prototype.slice.call(arguments);
- var callback = this.extractCallback(args);
- var payload = this.toPayload(args);
- if (!callback) {
- return web3.eth.estimateGas(payload);
- }
- web3.eth.estimateGas(payload, callback);
- };
- /**
- * Should be used to get function display name
- *
- * @method displayName
- * @return {String} display name of the function
- */
- SolidityFunction.prototype.displayName = function () {
- return utils.extractDisplayName(this._name);
- };
- /**
- * Should be used to get function type name
- *
- * @method typeName
- * @return {String} type name of the function
- */
- SolidityFunction.prototype.typeName = function () {
- return utils.extractTypeName(this._name);
- };
- /**
- * Should be called to get rpc requests from solidity function
- *
- * @method request
- * @returns {Object}
- */
- SolidityFunction.prototype.request = function () {
- var args = Array.prototype.slice.call(arguments);
- var callback = this.extractCallback(args);
- var payload = this.toPayload(args);
- var format = this.unpackOutput.bind(this);
-
- return {
- method: this._constant ? 'eth_call' : 'eth_sendTransaction',
- callback: callback,
- params: [payload],
- format: format
- };
- };
- /**
- * Should be called to execute function
- *
- * @method execute
- */
- SolidityFunction.prototype.execute = function () {
- var transaction = !this._constant;
- // send transaction
- if (transaction) {
- return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments));
- }
- // call
- return this.call.apply(this, Array.prototype.slice.call(arguments));
- };
- /**
- * Should be called to attach function to contract
- *
- * @method attachToContract
- * @param {Contract}
- */
- SolidityFunction.prototype.attachToContract = function (contract) {
- var execute = this.execute.bind(this);
- execute.request = this.request.bind(this);
- execute.call = this.call.bind(this);
- execute.sendTransaction = this.sendTransaction.bind(this);
- execute.estimateGas = this.estimateGas.bind(this);
- var displayName = this.displayName();
- if (!contract[displayName]) {
- contract[displayName] = execute;
- }
- contract[displayName][this.typeName()] = execute; // circular!!!!
- };
- module.exports = SolidityFunction;
- },{"../solidity/coder":1,"../utils/sha3":6,"../utils/utils":7,"../web3":9,"./formatters":18}],20:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /** @file httpprovider.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * Marian Oancea <marian@ethdev.com>
- * Fabian Vogelsteller <fabian@ethdev.com>
- * @date 2015
- */
- "use strict";
- var XMLHttpRequest = (typeof window !== 'undefined' && window.XMLHttpRequest) ? window.XMLHttpRequest : require('xmlhttprequest').XMLHttpRequest; // jshint ignore:line
- var errors = require('./errors');
- var HttpProvider = function (host) {
- this.host = host || 'http://localhost:8545';
- };
- HttpProvider.prototype.isConnected = function() {
- var request = new XMLHttpRequest();
- request.open('POST', this.host, false);
- request.setRequestHeader('Content-type','application/json');
-
- try {
- request.send(JSON.stringify({
- id: 9999999999,
- jsonrpc: '2.0',
- method: 'net_listening',
- params: []
- }));
- return true;
- } catch(e) {
- return false;
- }
- };
- HttpProvider.prototype.send = function (payload) {
- var request = new XMLHttpRequest();
- request.open('POST', this.host, false);
- request.setRequestHeader('Content-type','application/json');
-
- try {
- request.send(JSON.stringify(payload));
- } catch(error) {
- throw errors.InvalidConnection(this.host);
- }
- // check request.status
- // TODO: throw an error here! it cannot silently fail!!!
- //if (request.status !== 200) {
- //return;
- //}
- var result = request.responseText;
- try {
- result = JSON.parse(result);
- } catch(e) {
- throw errors.InvalidResponse(request.responseText);
- }
- return result;
- };
- HttpProvider.prototype.sendAsync = function (payload, callback) {
- var request = new XMLHttpRequest();
- request.onreadystatechange = function() {
- if (request.readyState === 4) {
- var result = request.responseText;
- var error = null;
- try {
- result = JSON.parse(result);
- } catch(e) {
- error = errors.InvalidResponse(request.responseText);
- }
- callback(error, result);
- }
- };
- request.open('POST', this.host, true);
- request.setRequestHeader('Content-type','application/json');
-
- try {
- request.send(JSON.stringify(payload));
- } catch(error) {
- callback(errors.InvalidConnection(this.host));
- }
- };
- module.exports = HttpProvider;
- },{"./errors":14,"xmlhttprequest":4}],21:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file icap.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var utils = require('../utils/utils');
- /**
- * This prototype should be used to extract necessary information from iban address
- *
- * @param {String} iban
- */
- var ICAP = function (iban) {
- this._iban = iban;
- };
- /**
- * Should be called to check if icap is correct
- *
- * @method isValid
- * @returns {Boolean} true if it is, otherwise false
- */
- ICAP.prototype.isValid = function () {
- return utils.isIBAN(this._iban);
- };
- /**
- * Should be called to check if iban number is direct
- *
- * @method isDirect
- * @returns {Boolean} true if it is, otherwise false
- */
- ICAP.prototype.isDirect = function () {
- return this._iban.length === 34;
- };
- /**
- * Should be called to check if iban number if indirect
- *
- * @method isIndirect
- * @returns {Boolean} true if it is, otherwise false
- */
- ICAP.prototype.isIndirect = function () {
- return this._iban.length === 20;
- };
- /**
- * Should be called to get iban checksum
- * Uses the mod-97-10 checksumming protocol (ISO/IEC 7064:2003)
- *
- * @method checksum
- * @returns {String} checksum
- */
- ICAP.prototype.checksum = function () {
- return this._iban.substr(2, 2);
- };
- /**
- * Should be called to get institution identifier
- * eg. XREG
- *
- * @method institution
- * @returns {String} institution identifier
- */
- ICAP.prototype.institution = function () {
- return this.isIndirect() ? this._iban.substr(7, 4) : '';
- };
- /**
- * Should be called to get client identifier within institution
- * eg. GAVOFYORK
- *
- * @method client
- * @returns {String} client identifier
- */
- ICAP.prototype.client = function () {
- return this.isIndirect() ? this._iban.substr(11) : '';
- };
- /**
- * Should be called to get client direct address
- *
- * @method address
- * @returns {String} client direct address
- */
- ICAP.prototype.address = function () {
- return this.isDirect() ? this._iban.substr(4) : '';
- };
- module.exports = ICAP;
- },{"../utils/utils":7}],22:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /** @file ipcprovider.js
- * @authors:
- * Fabian Vogelsteller <fabian@ethdev.com>
- * @date 2015
- */
- "use strict";
- var utils = require('../utils/utils');
- var errors = require('./errors');
- var errorTimeout = '{"jsonrpc": "2.0", "error": {"code": -32603, "message": "IPC Request timed out for method \'__method__\'"}, "id": "__id__"}';
- var IpcProvider = function (path, net) {
- var _this = this;
- this.responseCallbacks = {};
- this.path = path;
-
- net = net || require('net');
- this.connection = net.connect({path: this.path});
- this.connection.on('error', function(e){
- console.error('IPC Connection Error', e);
- _this._timeout();
- });
- this.connection.on('end', function(){
- _this._timeout();
- });
- // LISTEN FOR CONNECTION RESPONSES
- this.connection.on('data', function(data) {
- /*jshint maxcomplexity: 6 */
- _this._parseResponse(data.toString()).forEach(function(result){
- var id = null;
- // get the id which matches the returned id
- if(utils.isArray(result)) {
- result.forEach(function(load){
- if(_this.responseCallbacks[load.id])
- id = load.id;
- });
- } else {
- id = result.id;
- }
- // fire the callback
- if(_this.responseCallbacks[id]) {
- _this.responseCallbacks[id](null, result);
- delete _this.responseCallbacks[id];
- }
- });
- });
- };
- /**
- Will parse the response and make an array out of it.
- @method _parseResponse
- @param {String} data
- */
- IpcProvider.prototype._parseResponse = function(data) {
- var _this = this,
- returnValues = [];
-
- // DE-CHUNKER
- var dechunkedData = data
- .replace(/\}\{/g,'}|--|{') // }{
- .replace(/\}\]\[\{/g,'}]|--|[{') // }][{
- .replace(/\}\[\{/g,'}|--|[{') // }[{
- .replace(/\}\]\{/g,'}]|--|{') // }]{
- .split('|--|');
- dechunkedData.forEach(function(data){
- // prepend the last chunk
- if(_this.lastChunk)
- data = _this.lastChunk + data;
- var result = null;
- try {
- result = JSON.parse(data);
- } catch(e) {
- _this.lastChunk = data;
- // start timeout to cancel all requests
- clearTimeout(_this.lastChunkTimeout);
- _this.lastChunkTimeout = setTimeout(function(){
- _this.timeout();
- throw errors.InvalidResponse(data);
- }, 1000 * 15);
- return;
- }
- // cancel timeout and set chunk to null
- clearTimeout(_this.lastChunkTimeout);
- _this.lastChunk = null;
- if(result)
- returnValues.push(result);
- });
- return returnValues;
- };
- /**
- Get the adds a callback to the responseCallbacks object,
- which will be called if a response matching the response Id will arrive.
- @method _addResponseCallback
- */
- IpcProvider.prototype._addResponseCallback = function(payload, callback) {
- var id = payload.id || payload[0].id;
- var method = payload.method || payload[0].method;
- this.responseCallbacks[id] = callback;
- this.responseCallbacks[id].method = method;
- };
- /**
- Timeout all requests when the end/error event is fired
- @method _timeout
- */
- IpcProvider.prototype._timeout = function() {
- for(var key in this.responseCallbacks) {
- if(this.responseCallbacks.hasOwnProperty(key)){
- this.responseCallbacks[key](errorTimeout.replace('__id__', key).replace('__method__', this.responseCallbacks[key].method));
- delete this.responseCallbacks[key];
- }
- }
- };
- /**
- Check if the current connection is still valid.
- @method isConnected
- */
- IpcProvider.prototype.isConnected = function() {
- var _this = this;
- // try reconnect, when connection is gone
- if(!_this.connection.writable)
- _this.connection.connect({path: _this.path});
- return !!this.connection.writable;
- };
- IpcProvider.prototype.send = function (payload) {
- if(this.connection.writeSync) {
- var result;
- // try reconnect, when connection is gone
- if(!this.connection.writable)
- this.connection.connect({path: this.path});
- var data = this.connection.writeSync(JSON.stringify(payload));
- try {
- result = JSON.parse(data);
- } catch(e) {
- throw errors.InvalidResponse(data);
- }
- return result;
- } else {
- throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.');
- }
- };
- IpcProvider.prototype.sendAsync = function (payload, callback) {
- // try reconnect, when connection is gone
- if(!this.connection.writable)
- this.connection.connect({path: this.path});
- this.connection.write(JSON.stringify(payload));
- this._addResponseCallback(payload, callback);
- };
- module.exports = IpcProvider;
- },{"../utils/utils":7,"./errors":14,"net":32}],23:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /** @file jsonrpc.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var Jsonrpc = function () {
- // singleton pattern
- if (arguments.callee._singletonInstance) {
- return arguments.callee._singletonInstance;
- }
- arguments.callee._singletonInstance = this;
- this.messageId = 1;
- };
- /**
- * @return {Jsonrpc} singleton
- */
- Jsonrpc.getInstance = function () {
- var instance = new Jsonrpc();
- return instance;
- };
- /**
- * Should be called to valid json create payload object
- *
- * @method toPayload
- * @param {Function} method of jsonrpc call, required
- * @param {Array} params, an array of method params, optional
- * @returns {Object} valid jsonrpc payload object
- */
- Jsonrpc.prototype.toPayload = function (method, params) {
- if (!method)
- console.error('jsonrpc method should be specified!');
- return {
- jsonrpc: '2.0',
- method: method,
- params: params || [],
- id: this.messageId++
- };
- };
- /**
- * Should be called to check if jsonrpc response is valid
- *
- * @method isValidResponse
- * @param {Object}
- * @returns {Boolean} true if response is valid, otherwise false
- */
- Jsonrpc.prototype.isValidResponse = function (response) {
- return !!response &&
- !response.error &&
- response.jsonrpc === '2.0' &&
- typeof response.id === 'number' &&
- response.result !== undefined; // only undefined is not valid json object
- };
- /**
- * Should be called to create batch payload object
- *
- * @method toBatchPayload
- * @param {Array} messages, an array of objects with method (required) and params (optional) fields
- * @returns {Array} batch payload
- */
- Jsonrpc.prototype.toBatchPayload = function (messages) {
- var self = this;
- return messages.map(function (message) {
- return self.toPayload(message.method, message.params);
- });
- };
- module.exports = Jsonrpc;
- },{}],24:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file method.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var RequestManager = require('./requestmanager');
- var utils = require('../utils/utils');
- var errors = require('./errors');
- var Method = function (options) {
- this.name = options.name;
- this.call = options.call;
- this.params = options.params || 0;
- this.inputFormatter = options.inputFormatter;
- this.outputFormatter = options.outputFormatter;
- };
- /**
- * Should be used to determine name of the jsonrpc method based on arguments
- *
- * @method getCall
- * @param {Array} arguments
- * @return {String} name of jsonrpc method
- */
- Method.prototype.getCall = function (args) {
- return utils.isFunction(this.call) ? this.call(args) : this.call;
- };
- /**
- * Should be used to extract callback from array of arguments. Modifies input param
- *
- * @method extractCallback
- * @param {Array} arguments
- * @return {Function|Null} callback, if exists
- */
- Method.prototype.extractCallback = function (args) {
- if (utils.isFunction(args[args.length - 1])) {
- return args.pop(); // modify the args array!
- }
- };
- /**
- * Should be called to check if the number of arguments is correct
- *
- * @method validateArgs
- * @param {Array} arguments
- * @throws {Error} if it is not
- */
- Method.prototype.validateArgs = function (args) {
- if (args.length !== this.params) {
- throw errors.InvalidNumberOfParams();
- }
- };
- /**
- * Should be called to format input args of method
- *
- * @method formatInput
- * @param {Array}
- * @return {Array}
- */
- Method.prototype.formatInput = function (args) {
- if (!this.inputFormatter) {
- return args;
- }
- return this.inputFormatter.map(function (formatter, index) {
- return formatter ? formatter(args[index]) : args[index];
- });
- };
- /**
- * Should be called to format output(result) of method
- *
- * @method formatOutput
- * @param {Object}
- * @return {Object}
- */
- Method.prototype.formatOutput = function (result) {
- return this.outputFormatter && result ? this.outputFormatter(result) : result;
- };
- /**
- * Should attach function to method
- *
- * @method attachToObject
- * @param {Object}
- * @param {Function}
- */
- Method.prototype.attachToObject = function (obj) {
- var func = this.send.bind(this);
- func.request = this.request.bind(this);
- func.call = this.call; // that's ugly. filter.js uses it
- var name = this.name.split('.');
- if (name.length > 1) {
- obj[name[0]] = obj[name[0]] || {};
- obj[name[0]][name[1]] = func;
- } else {
- obj[name[0]] = func;
- }
- };
- /**
- * Should create payload from given input args
- *
- * @method toPayload
- * @param {Array} args
- * @return {Object}
- */
- Method.prototype.toPayload = function (args) {
- var call = this.getCall(args);
- var callback = this.extractCallback(args);
- var params = this.formatInput(args);
- this.validateArgs(params);
- return {
- method: call,
- params: params,
- callback: callback
- };
- };
- /**
- * Should be called to create pure JSONRPC request which can be used in batch request
- *
- * @method request
- * @param {...} params
- * @return {Object} jsonrpc request
- */
- Method.prototype.request = function () {
- var payload = this.toPayload(Array.prototype.slice.call(arguments));
- payload.format = this.formatOutput.bind(this);
- return payload;
- };
- /**
- * Should send request to the API
- *
- * @method send
- * @param list of params
- * @return result
- */
- Method.prototype.send = function () {
- var payload = this.toPayload(Array.prototype.slice.call(arguments));
- if (payload.callback) {
- var self = this;
- return RequestManager.getInstance().sendAsync(payload, function (err, result) {
- payload.callback(err, self.formatOutput(result));
- });
- }
- return this.formatOutput(RequestManager.getInstance().send(payload));
- };
- module.exports = Method;
- },{"../utils/utils":7,"./errors":14,"./requestmanager":28}],25:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file namereg.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var contract = require('./contract');
- var address = '0xc6d9d2cd449a754c494264e1809c50e34d64562b';
- var abi = [
- {"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"name","outputs":[{"name":"o_name","type":"bytes32"}],"type":"function"},
- {"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},
- {"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"content","outputs":[{"name":"","type":"bytes32"}],"type":"function"},
- {"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"addr","outputs":[{"name":"","type":"address"}],"type":"function"},
- {"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserve","outputs":[],"type":"function"},
- {"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"subRegistrar","outputs":[{"name":"o_subRegistrar","type":"address"}],"type":"function"},
- {"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_newOwner","type":"address"}],"name":"transfer","outputs":[],"type":"function"},
- {"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_registrar","type":"address"}],"name":"setSubRegistrar","outputs":[],"type":"function"},
- {"constant":false,"inputs":[],"name":"Registrar","outputs":[],"type":"function"},
- {"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_a","type":"address"},{"name":"_primary","type":"bool"}],"name":"setAddress","outputs":[],"type":"function"},
- {"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_content","type":"bytes32"}],"name":"setContent","outputs":[],"type":"function"},
- {"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"disown","outputs":[],"type":"function"},
- {"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"register","outputs":[{"name":"","type":"address"}],"type":"function"},
- {"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"}],"name":"Changed","type":"event"},
- {"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"addr","type":"address"}],"name":"PrimaryChanged","type":"event"}
- ];
- module.exports = contract(abi).at(address);
- },{"./contract":12}],26:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /** @file eth.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var utils = require('../utils/utils');
- var Property = require('./property');
- /// @returns an array of objects describing web3.eth api methods
- var methods = [
- ];
- /// @returns an array of objects describing web3.eth api properties
- var properties = [
- new Property({
- name: 'listening',
- getter: 'net_listening'
- }),
- new Property({
- name: 'peerCount',
- getter: 'net_peerCount',
- outputFormatter: utils.toDecimal
- })
- ];
- module.exports = {
- methods: methods,
- properties: properties
- };
- },{"../utils/utils":7,"./property":27}],27:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file property.js
- * @author Fabian Vogelsteller <fabian@frozeman.de>
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var RequestManager = require('./requestmanager');
- var utils = require('../utils/utils');
- var Property = function (options) {
- this.name = options.name;
- this.getter = options.getter;
- this.setter = options.setter;
- this.outputFormatter = options.outputFormatter;
- this.inputFormatter = options.inputFormatter;
- };
- /**
- * Should be called to format input args of method
- *
- * @method formatInput
- * @param {Array}
- * @return {Array}
- */
- Property.prototype.formatInput = function (arg) {
- return this.inputFormatter ? this.inputFormatter(arg) : arg;
- };
- /**
- * Should be called to format output(result) of method
- *
- * @method formatOutput
- * @param {Object}
- * @return {Object}
- */
- Property.prototype.formatOutput = function (result) {
- return this.outputFormatter && result !== null ? this.outputFormatter(result) : result;
- };
- /**
- * Should be used to extract callback from array of arguments. Modifies input param
- *
- * @method extractCallback
- * @param {Array} arguments
- * @return {Function|Null} callback, if exists
- */
- Property.prototype.extractCallback = function (args) {
- if (utils.isFunction(args[args.length - 1])) {
- return args.pop(); // modify the args array!
- }
- };
- /**
- * Should attach function to method
- *
- * @method attachToObject
- * @param {Object}
- * @param {Function}
- */
- Property.prototype.attachToObject = function (obj) {
- var proto = {
- get: this.get.bind(this),
- };
- var names = this.name.split('.');
- var name = names[0];
- if (names.length > 1) {
- obj[names[0]] = obj[names[0]] || {};
- obj = obj[names[0]];
- name = names[1];
- }
-
- Object.defineProperty(obj, name, proto);
- var toAsyncName = function (prefix, name) {
- return prefix + name.charAt(0).toUpperCase() + name.slice(1);
- };
- var func = this.getAsync.bind(this);
- func.request = this.request.bind(this);
- obj[toAsyncName('get', name)] = func;
- };
- /**
- * Should be used to get value of the property
- *
- * @method get
- * @return {Object} value of the property
- */
- Property.prototype.get = function () {
- return this.formatOutput(RequestManager.getInstance().send({
- method: this.getter
- }));
- };
- /**
- * Should be used to asynchrounously get value of property
- *
- * @method getAsync
- * @param {Function}
- */
- Property.prototype.getAsync = function (callback) {
- var self = this;
- RequestManager.getInstance().sendAsync({
- method: this.getter
- }, function (err, result) {
- if (err) {
- return callback(err);
- }
- callback(err, self.formatOutput(result));
- });
- };
- /**
- * Should be called to create pure JSONRPC request which can be used in batch request
- *
- * @method request
- * @param {...} params
- * @return {Object} jsonrpc request
- */
- Property.prototype.request = function () {
- var payload = {
- method: this.getter,
- params: [],
- callback: this.extractCallback(Array.prototype.slice.call(arguments))
- };
- payload.format = this.formatOutput.bind(this);
- return payload;
- };
- module.exports = Property;
- },{"../utils/utils":7,"./requestmanager":28}],28:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file requestmanager.js
- * @author Jeffrey Wilcke <jeff@ethdev.com>
- * @author Marek Kotewicz <marek@ethdev.com>
- * @author Marian Oancea <marian@ethdev.com>
- * @author Fabian Vogelsteller <fabian@ethdev.com>
- * @author Gav Wood <g@ethdev.com>
- * @date 2014
- */
- var Jsonrpc = require('./jsonrpc');
- var utils = require('../utils/utils');
- var c = require('../utils/config');
- var errors = require('./errors');
- /**
- * It's responsible for passing messages to providers
- * It's also responsible for polling the ethereum node for incoming messages
- * Default poll timeout is 1 second
- * Singleton
- */
- var RequestManager = function (provider) {
- // singleton pattern
- if (arguments.callee._singletonInstance) {
- return arguments.callee._singletonInstance;
- }
- arguments.callee._singletonInstance = this;
- this.provider = provider;
- this.polls = {};
- this.timeout = null;
- this.isPolling = false;
- };
- /**
- * @return {RequestManager} singleton
- */
- RequestManager.getInstance = function () {
- var instance = new RequestManager();
- return instance;
- };
- /**
- * Should be used to synchronously send request
- *
- * @method send
- * @param {Object} data
- * @return {Object}
- */
- RequestManager.prototype.send = function (data) {
- if (!this.provider) {
- console.error(errors.InvalidProvider());
- return null;
- }
- var payload = Jsonrpc.getInstance().toPayload(data.method, data.params);
- var result = this.provider.send(payload);
- if (!Jsonrpc.getInstance().isValidResponse(result)) {
- throw errors.InvalidResponse(result);
- }
- return result.result;
- };
- /**
- * Should be used to asynchronously send request
- *
- * @method sendAsync
- * @param {Object} data
- * @param {Function} callback
- */
- RequestManager.prototype.sendAsync = function (data, callback) {
- if (!this.provider) {
- return callback(errors.InvalidProvider());
- }
- var payload = Jsonrpc.getInstance().toPayload(data.method, data.params);
- this.provider.sendAsync(payload, function (err, result) {
- if (err) {
- return callback(err);
- }
-
- if (!Jsonrpc.getInstance().isValidResponse(result)) {
- return callback(errors.InvalidResponse(result));
- }
- callback(null, result.result);
- });
- };
- /**
- * Should be called to asynchronously send batch request
- *
- * @method sendBatch
- * @param {Array} batch data
- * @param {Function} callback
- */
- RequestManager.prototype.sendBatch = function (data, callback) {
- if (!this.provider) {
- return callback(errors.InvalidProvider());
- }
- var payload = Jsonrpc.getInstance().toBatchPayload(data);
- this.provider.sendAsync(payload, function (err, results) {
- if (err) {
- return callback(err);
- }
- if (!utils.isArray(results)) {
- return callback(errors.InvalidResponse(results));
- }
- callback(err, results);
- });
- };
- /**
- * Should be used to set provider of request manager
- *
- * @method setProvider
- * @param {Object}
- */
- RequestManager.prototype.setProvider = function (p) {
- this.provider = p;
- if (this.provider && !this.isPolling) {
- this.poll();
- this.isPolling = true;
- }
- };
- /*jshint maxparams:4 */
- /**
- * Should be used to start polling
- *
- * @method startPolling
- * @param {Object} data
- * @param {Number} pollId
- * @param {Function} callback
- * @param {Function} uninstall
- *
- * @todo cleanup number of params
- */
- RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) {
- this.polls['poll_'+ pollId] = {data: data, id: pollId, callback: callback, uninstall: uninstall};
- };
- /*jshint maxparams:3 */
- /**
- * Should be used to stop polling for filter with given id
- *
- * @method stopPolling
- * @param {Number} pollId
- */
- RequestManager.prototype.stopPolling = function (pollId) {
- delete this.polls['poll_'+ pollId];
- };
- /**
- * Should be called to reset the polling mechanism of the request manager
- *
- * @method reset
- */
- RequestManager.prototype.reset = function () {
- for (var key in this.polls) {
- this.polls[key].uninstall();
- }
- this.polls = {};
- if (this.timeout) {
- clearTimeout(this.timeout);
- this.timeout = null;
- }
- this.poll();
- };
- /**
- * Should be called to poll for changes on filter with given id
- *
- * @method poll
- */
- RequestManager.prototype.poll = function () {
- /*jshint maxcomplexity: 6 */
- this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT);
- if (Object.keys(this.polls).length === 0) {
- return;
- }
- if (!this.provider) {
- console.error(errors.InvalidProvider());
- return;
- }
- var pollsData = [];
- var pollsKeys = [];
- for (var key in this.polls) {
- pollsData.push(this.polls[key].data);
- pollsKeys.push(key);
- }
- if (pollsData.length === 0) {
- return;
- }
- var payload = Jsonrpc.getInstance().toBatchPayload(pollsData);
- var self = this;
- this.provider.sendAsync(payload, function (error, results) {
- // TODO: console log?
- if (error) {
- return;
- }
- if (!utils.isArray(results)) {
- throw errors.InvalidResponse(results);
- }
- results.map(function (result, index) {
- var key = pollsKeys[index];
- // make sure the filter is still installed after arrival of the request
- if (self.polls[key]) {
- result.callback = self.polls[key].callback;
- return result;
- } else
- return false;
- }).filter(function (result) {
- return !!result;
- }).filter(function (result) {
- var valid = Jsonrpc.getInstance().isValidResponse(result);
- if (!valid) {
- result.callback(errors.InvalidResponse(result));
- }
- return valid;
- }).filter(function (result) {
- return utils.isArray(result.result) && result.result.length > 0;
- }).forEach(function (result) {
- result.callback(null, result.result);
- });
- });
- };
- module.exports = RequestManager;
- },{"../utils/config":5,"../utils/utils":7,"./errors":14,"./jsonrpc":23}],29:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /** @file shh.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var Method = require('./method');
- var formatters = require('./formatters');
- var post = new Method({
- name: 'post',
- call: 'shh_post',
- params: 1,
- inputFormatter: [formatters.inputPostFormatter]
- });
- var newIdentity = new Method({
- name: 'newIdentity',
- call: 'shh_newIdentity',
- params: 0
- });
- var hasIdentity = new Method({
- name: 'hasIdentity',
- call: 'shh_hasIdentity',
- params: 1
- });
- var newGroup = new Method({
- name: 'newGroup',
- call: 'shh_newGroup',
- params: 0
- });
- var addToGroup = new Method({
- name: 'addToGroup',
- call: 'shh_addToGroup',
- params: 0
- });
- var methods = [
- post,
- newIdentity,
- hasIdentity,
- newGroup,
- addToGroup
- ];
- module.exports = {
- methods: methods
- };
- },{"./formatters":18,"./method":24}],30:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /**
- * @file transfer.js
- * @author Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var web3 = require('../web3');
- var ICAP = require('./icap');
- var namereg = require('./namereg');
- var contract = require('./contract');
- /**
- * Should be used to make ICAP transfer
- *
- * @method transfer
- * @param {String} iban number
- * @param {String} from (address)
- * @param {Value} value to be tranfered
- * @param {Function} callback, callback
- */
- var transfer = function (from, iban, value, callback) {
- var icap = new ICAP(iban);
- if (!icap.isValid()) {
- throw new Error('invalid iban address');
- }
- if (icap.isDirect()) {
- return transferToAddress(from, icap.address(), value, callback);
- }
-
- if (!callback) {
- var address = namereg.addr(icap.institution());
- return deposit(from, address, value, icap.client());
- }
- namereg.addr(icap.insitution(), function (err, address) {
- return deposit(from, address, value, icap.client(), callback);
- });
-
- };
- /**
- * Should be used to transfer funds to certain address
- *
- * @method transferToAddress
- * @param {String} address
- * @param {String} from (address)
- * @param {Value} value to be tranfered
- * @param {Function} callback, callback
- */
- var transferToAddress = function (from, address, value, callback) {
- return web3.eth.sendTransaction({
- address: address,
- from: from,
- value: value
- }, callback);
- };
- /**
- * Should be used to deposit funds to generic Exchange contract (must implement deposit(bytes32) method!)
- *
- * @method deposit
- * @param {String} address
- * @param {String} from (address)
- * @param {Value} value to be tranfered
- * @param {String} client unique identifier
- * @param {Function} callback, callback
- */
- var deposit = function (from, address, value, client, callback) {
- var abi = [{"constant":false,"inputs":[{"name":"name","type":"bytes32"}],"name":"deposit","outputs":[],"type":"function"}];
- return contract(abi).at(address).deposit(client, {
- from: from,
- value: value
- }, callback);
- };
- module.exports = transfer;
- },{"../web3":9,"./contract":12,"./icap":21,"./namereg":25}],31:[function(require,module,exports){
- /*
- This file is part of ethereum.js.
- ethereum.js is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- ethereum.js is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
- */
- /** @file watches.js
- * @authors:
- * Marek Kotewicz <marek@ethdev.com>
- * @date 2015
- */
- var Method = require('./method');
- /// @returns an array of objects describing web3.eth.filter api methods
- var eth = function () {
- var newFilterCall = function (args) {
- var type = args[0];
- switch(type) {
- case 'latest':
- args.shift();
- this.params = 0;
- return 'eth_newBlockFilter';
- case 'pending':
- args.shift();
- this.params = 0;
- return 'eth_newPendingTransactionFilter';
- default:
- return 'eth_newFilter';
- }
- };
- var newFilter = new Method({
- name: 'newFilter',
- call: newFilterCall,
- params: 1
- });
- var uninstallFilter = new Method({
- name: 'uninstallFilter',
- call: 'eth_uninstallFilter',
- params: 1
- });
- var getLogs = new Method({
- name: 'getLogs',
- call: 'eth_getFilterLogs',
- params: 1
- });
- var poll = new Method({
- name: 'poll',
- call: 'eth_getFilterChanges',
- params: 1
- });
- return [
- newFilter,
- uninstallFilter,
- getLogs,
- poll
- ];
- };
- /// @returns an array of objects describing web3.shh.watch api methods
- var shh = function () {
- var newFilter = new Method({
- name: 'newFilter',
- call: 'shh_newFilter',
- params: 1
- });
- var uninstallFilter = new Method({
- name: 'uninstallFilter',
- call: 'shh_uninstallFilter',
- params: 1
- });
- var getLogs = new Method({
- name: 'getLogs',
- call: 'shh_getMessages',
- params: 1
- });
- var poll = new Method({
- name: 'poll',
- call: 'shh_getFilterChanges',
- params: 1
- });
- return [
- newFilter,
- uninstallFilter,
- getLogs,
- poll
- ];
- };
- module.exports = {
- eth: eth,
- shh: shh
- };
- },{"./method":24}],32:[function(require,module,exports){
- },{}],33:[function(require,module,exports){
- ;(function (root, factory) {
- if (typeof exports === "object") {
- // CommonJS
- module.exports = exports = factory();
- }
- else if (typeof define === "function" && define.amd) {
- // AMD
- define([], factory);
- }
- else {
- // Global (browser)
- root.CryptoJS = factory();
- }
- }(this, function () {
- /**
- * CryptoJS core components.
- */
- var CryptoJS = CryptoJS || (function (Math, undefined) {
- /**
- * CryptoJS namespace.
- */
- var C = {};
- /**
- * Library namespace.
- */
- var C_lib = C.lib = {};
- /**
- * Base object for prototypal inheritance.
- */
- var Base = C_lib.Base = (function () {
- function F() {}
- return {
- /**
- * Creates a new object that inherits from this object.
- *
- * @param {Object} overrides Properties to copy into the new object.
- *
- * @return {Object} The new object.
- *
- * @static
- *
- * @example
- *
- * var MyType = CryptoJS.lib.Base.extend({
- * field: 'value',
- *
- * method: function () {
- * }
- * });
- */
- extend: function (overrides) {
- // Spawn
- F.prototype = this;
- var subtype = new F();
- // Augment
- if (overrides) {
- subtype.mixIn(overrides);
- }
- // Create default initializer
- if (!subtype.hasOwnProperty('init')) {
- subtype.init = function () {
- subtype.$super.init.apply(this, arguments);
- };
- }
- // Initializer's prototype is the subtype object
- subtype.init.prototype = subtype;
- // Reference supertype
- subtype.$super = this;
- return subtype;
- },
- /**
- * Extends this object and runs the init method.
- * Arguments to create() will be passed to init().
- *
- * @return {Object} The new object.
- *
- * @static
- *
- * @example
- *
- * var instance = MyType.create();
- */
- create: function () {
- var instance = this.extend();
- instance.init.apply(instance, arguments);
- return instance;
- },
- /**
- * Initializes a newly created object.
- * Override this method to add some logic when your objects are created.
- *
- * @example
- *
- * var MyType = CryptoJS.lib.Base.extend({
- * init: function () {
- * // ...
- * }
- * });
- */
- init: function () {
- },
- /**
- * Copies properties into this object.
- *
- * @param {Object} properties The properties to mix in.
- *
- * @example
- *
- * MyType.mixIn({
- * field: 'value'
- * });
- */
- mixIn: function (properties) {
- for (var propertyName in properties) {
- if (properties.hasOwnProperty(propertyName)) {
- this[propertyName] = properties[propertyName];
- }
- }
- // IE won't copy toString using the loop above
- if (properties.hasOwnProperty('toString')) {
- this.toString = properties.toString;
- }
- },
- /**
- * Creates a copy of this object.
- *
- * @return {Object} The clone.
- *
- * @example
- *
- * var clone = instance.clone();
- */
- clone: function () {
- return this.init.prototype.extend(this);
- }
- };
- }());
- /**
- * An array of 32-bit words.
- *
- * @property {Array} words The array of 32-bit words.
- * @property {number} sigBytes The number of significant bytes in this word array.
- */
- var WordArray = C_lib.WordArray = Base.extend({
- /**
- * Initializes a newly created word array.
- *
- * @param {Array} words (Optional) An array of 32-bit words.
- * @param {number} sigBytes (Optional) The number of significant bytes in the words.
- *
- * @example
- *
- * var wordArray = CryptoJS.lib.WordArray.create();
- * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
- * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
- */
- init: function (words, sigBytes) {
- words = this.words = words || [];
- if (sigBytes != undefined) {
- this.sigBytes = sigBytes;
- } else {
- this.sigBytes = words.length * 4;
- }
- },
- /**
- * Converts this word array to a string.
- *
- * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
- *
- * @return {string} The stringified word array.
- *
- * @example
- *
- * var string = wordArray + '';
- * var string = wordArray.toString();
- * var string = wordArray.toString(CryptoJS.enc.Utf8);
- */
- toString: function (encoder) {
- return (encoder || Hex).stringify(this);
- },
- /**
- * Concatenates a word array to this word array.
- *
- * @param {WordArray} wordArray The word array to append.
- *
- * @return {WordArray} This word array.
- *
- * @example
- *
- * wordArray1.concat(wordArray2);
- */
- concat: function (wordArray) {
- // Shortcuts
- var thisWords = this.words;
- var thatWords = wordArray.words;
- var thisSigBytes = this.sigBytes;
- var thatSigBytes = wordArray.sigBytes;
- // Clamp excess bits
- this.clamp();
- // Concat
- if (thisSigBytes % 4) {
- // Copy one byte at a time
- for (var i = 0; i < thatSigBytes; i++) {
- var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
- thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
- }
- } else {
- // Copy one word at a time
- for (var i = 0; i < thatSigBytes; i += 4) {
- thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
- }
- }
- this.sigBytes += thatSigBytes;
- // Chainable
- return this;
- },
- /**
- * Removes insignificant bits.
- *
- * @example
- *
- * wordArray.clamp();
- */
- clamp: function () {
- // Shortcuts
- var words = this.words;
- var sigBytes = this.sigBytes;
- // Clamp
- words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
- words.length = Math.ceil(sigBytes / 4);
- },
- /**
- * Creates a copy of this word array.
- *
- * @return {WordArray} The clone.
- *
- * @example
- *
- * var clone = wordArray.clone();
- */
- clone: function () {
- var clone = Base.clone.call(this);
- clone.words = this.words.slice(0);
- return clone;
- },
- /**
- * Creates a word array filled with random bytes.
- *
- * @param {number} nBytes The number of random bytes to generate.
- *
- * @return {WordArray} The random word array.
- *
- * @static
- *
- * @example
- *
- * var wordArray = CryptoJS.lib.WordArray.random(16);
- */
- random: function (nBytes) {
- var words = [];
- var r = (function (m_w) {
- var m_w = m_w;
- var m_z = 0x3ade68b1;
- var mask = 0xffffffff;
- return function () {
- m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
- m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
- var result = ((m_z << 0x10) + m_w) & mask;
- result /= 0x100000000;
- result += 0.5;
- return result * (Math.random() > .5 ? 1 : -1);
- }
- });
- for (var i = 0, rcache; i < nBytes; i += 4) {
- var _r = r((rcache || Math.random()) * 0x100000000);
- rcache = _r() * 0x3ade67b7;
- words.push((_r() * 0x100000000) | 0);
- }
- return new WordArray.init(words, nBytes);
- }
- });
- /**
- * Encoder namespace.
- */
- var C_enc = C.enc = {};
- /**
- * Hex encoding strategy.
- */
- var Hex = C_enc.Hex = {
- /**
- * Converts a word array to a hex string.
- *
- * @param {WordArray} wordArray The word array.
- *
- * @return {string} The hex string.
- *
- * @static
- *
- * @example
- *
- * var hexString = CryptoJS.enc.Hex.stringify(wordArray);
- */
- stringify: function (wordArray) {
- // Shortcuts
- var words = wordArray.words;
- var sigBytes = wordArray.sigBytes;
- // Convert
- var hexChars = [];
- for (var i = 0; i < sigBytes; i++) {
- var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
- hexChars.push((bite >>> 4).toString(16));
- hexChars.push((bite & 0x0f).toString(16));
- }
- return hexChars.join('');
- },
- /**
- * Converts a hex string to a word array.
- *
- * @param {string} hexStr The hex string.
- *
- * @return {WordArray} The word array.
- *
- * @static
- *
- * @example
- *
- * var wordArray = CryptoJS.enc.Hex.parse(hexString);
- */
- parse: function (hexStr) {
- // Shortcut
- var hexStrLength = hexStr.length;
- // Convert
- var words = [];
- for (var i = 0; i < hexStrLength; i += 2) {
- words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
- }
- return new WordArray.init(words, hexStrLength / 2);
- }
- };
- /**
- * Latin1 encoding strategy.
- */
- var Latin1 = C_enc.Latin1 = {
- /**
- * Converts a word array to a Latin1 string.
- *
- * @param {WordArray} wordArray The word array.
- *
- * @return {string} The Latin1 string.
- *
- * @static
- *
- * @example
- *
- * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
- */
- stringify: function (wordArray) {
- // Shortcuts
- var words = wordArray.words;
- var sigBytes = wordArray.sigBytes;
- // Convert
- var latin1Chars = [];
- for (var i = 0; i < sigBytes; i++) {
- var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
- latin1Chars.push(String.fromCharCode(bite));
- }
- return latin1Chars.join('');
- },
- /**
- * Converts a Latin1 string to a word array.
- *
- * @param {string} latin1Str The Latin1 string.
- *
- * @return {WordArray} The word array.
- *
- * @static
- *
- * @example
- *
- * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
- */
- parse: function (latin1Str) {
- // Shortcut
- var latin1StrLength = latin1Str.length;
- // Convert
- var words = [];
- for (var i = 0; i < latin1StrLength; i++) {
- words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
- }
- return new WordArray.init(words, latin1StrLength);
- }
- };
- /**
- * UTF-8 encoding strategy.
- */
- var Utf8 = C_enc.Utf8 = {
- /**
- * Converts a word array to a UTF-8 string.
- *
- * @param {WordArray} wordArray The word array.
- *
- * @return {string} The UTF-8 string.
- *
- * @static
- *
- * @example
- *
- * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
- */
- stringify: function (wordArray) {
- try {
- return decodeURIComponent(escape(Latin1.stringify(wordArray)));
- } catch (e) {
- throw new Error('Malformed UTF-8 data');
- }
- },
- /**
- * Converts a UTF-8 string to a word array.
- *
- * @param {string} utf8Str The UTF-8 string.
- *
- * @return {WordArray} The word array.
- *
- * @static
- *
- * @example
- *
- * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
- */
- parse: function (utf8Str) {
- return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
- }
- };
- /**
- * Abstract buffered block algorithm template.
- *
- * The property blockSize must be implemented in a concrete subtype.
- *
- * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
- */
- var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
- /**
- * Resets this block algorithm's data buffer to its initial state.
- *
- * @example
- *
- * bufferedBlockAlgorithm.reset();
- */
- reset: function () {
- // Initial values
- this._data = new WordArray.init();
- this._nDataBytes = 0;
- },
- /**
- * Adds new data to this block algorithm's buffer.
- *
- * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
- *
- * @example
- *
- * bufferedBlockAlgorithm._append('data');
- * bufferedBlockAlgorithm._append(wordArray);
- */
- _append: function (data) {
- // Convert string to WordArray, else assume WordArray already
- if (typeof data == 'string') {
- data = Utf8.parse(data);
- }
- // Append
- this._data.concat(data);
- this._nDataBytes += data.sigBytes;
- },
- /**
- * Processes available data blocks.
- *
- * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
- *
- * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
- *
- * @return {WordArray} The processed data.
- *
- * @example
- *
- * var processedData = bufferedBlockAlgorithm._process();
- * var processedData = bufferedBlockAlgorithm._process(!!'flush');
- */
- _process: function (doFlush) {
- // Shortcuts
- var data = this._data;
- var dataWords = data.words;
- var dataSigBytes = data.sigBytes;
- var blockSize = this.blockSize;
- var blockSizeBytes = blockSize * 4;
- // Count blocks ready
- var nBlocksReady = dataSigBytes / blockSizeBytes;
- if (doFlush) {
- // Round up to include partial blocks
- nBlocksReady = Math.ceil(nBlocksReady);
- } else {
- // Round down to include only full blocks,
- // less the number of blocks that must remain in the buffer
- nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
- }
- // Count words ready
- var nWordsReady = nBlocksReady * blockSize;
- // Count bytes ready
- var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
- // Process blocks
- if (nWordsReady) {
- for (var offset = 0; offset < nWordsReady; offset += blockSize) {
- // Perform concrete-algorithm logic
- this._doProcessBlock(dataWords, offset);
- }
- // Remove processed words
- var processedWords = dataWords.splice(0, nWordsReady);
- data.sigBytes -= nBytesReady;
- }
- // Return processed words
- return new WordArray.init(processedWords, nBytesReady);
- },
- /**
- * Creates a copy of this object.
- *
- * @return {Object} The clone.
- *
- * @example
- *
- * var clone = bufferedBlockAlgorithm.clone();
- */
- clone: function () {
- var clone = Base.clone.call(this);
- clone._data = this._data.clone();
- return clone;
- },
- _minBufferSize: 0
- });
- /**
- * Abstract hasher template.
- *
- * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
- */
- var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
- /**
- * Configuration options.
- */
- cfg: Base.extend(),
- /**
- * Initializes a newly created hasher.
- *
- * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
- *
- * @example
- *
- * var hasher = CryptoJS.algo.SHA256.create();
- */
- init: function (cfg) {
- // Apply config defaults
- this.cfg = this.cfg.extend(cfg);
- // Set initial values
- this.reset();
- },
- /**
- * Resets this hasher to its initial state.
- *
- * @example
- *
- * hasher.reset();
- */
- reset: function () {
- // Reset data buffer
- BufferedBlockAlgorithm.reset.call(this);
- // Perform concrete-hasher logic
- this._doReset();
- },
- /**
- * Updates this hasher with a message.
- *
- * @param {WordArray|string} messageUpdate The message to append.
- *
- * @return {Hasher} This hasher.
- *
- * @example
- *
- * hasher.update('message');
- * hasher.update(wordArray);
- */
- update: function (messageUpdate) {
- // Append
- this._append(messageUpdate);
- // Update the hash
- this._process();
- // Chainable
- return this;
- },
- /**
- * Finalizes the hash computation.
- * Note that the finalize operation is effectively a destructive, read-once operation.
- *
- * @param {WordArray|string} messageUpdate (Optional) A final message update.
- *
- * @return {WordArray} The hash.
- *
- * @example
- *
- * var hash = hasher.finalize();
- * var hash = hasher.finalize('message');
- * var hash = hasher.finalize(wordArray);
- */
- finalize: function (messageUpdate) {
- // Final message update
- if (messageUpdate) {
- this._append(messageUpdate);
- }
- // Perform concrete-hasher logic
- var hash = this._doFinalize();
- return hash;
- },
- blockSize: 512/32,
- /**
- * Creates a shortcut function to a hasher's object interface.
- *
- * @param {Hasher} hasher The hasher to create a helper for.
- *
- * @return {Function} The shortcut function.
- *
- * @static
- *
- * @example
- *
- * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
- */
- _createHelper: function (hasher) {
- return function (message, cfg) {
- return new hasher.init(cfg).finalize(message);
- };
- },
- /**
- * Creates a shortcut function to the HMAC's object interface.
- *
- * @param {Hasher} hasher The hasher to use in this HMAC helper.
- *
- * @return {Function} The shortcut function.
- *
- * @static
- *
- * @example
- *
- * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
- */
- _createHmacHelper: function (hasher) {
- return function (message, key) {
- return new C_algo.HMAC.init(hasher, key).finalize(message);
- };
- }
- });
- /**
- * Algorithm namespace.
- */
- var C_algo = C.algo = {};
- return C;
- }(Math));
- return CryptoJS;
- }));
- },{}],34:[function(require,module,exports){
- ;(function (root, factory, undef) {
- if (typeof exports === "object") {
- // CommonJS
- module.exports = exports = factory(require("./core"), require("./x64-core"));
- }
- else if (typeof define === "function" && define.amd) {
- // AMD
- define(["./core", "./x64-core"], factory);
- }
- else {
- // Global (browser)
- factory(root.CryptoJS);
- }
- }(this, function (CryptoJS) {
- (function (Math) {
- // Shortcuts
- var C = CryptoJS;
- var C_lib = C.lib;
- var WordArray = C_lib.WordArray;
- var Hasher = C_lib.Hasher;
- var C_x64 = C.x64;
- var X64Word = C_x64.Word;
- var C_algo = C.algo;
- // Constants tables
- var RHO_OFFSETS = [];
- var PI_INDEXES = [];
- var ROUND_CONSTANTS = [];
- // Compute Constants
- (function () {
- // Compute rho offset constants
- var x = 1, y = 0;
- for (var t = 0; t < 24; t++) {
- RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
- var newX = y % 5;
- var newY = (2 * x + 3 * y) % 5;
- x = newX;
- y = newY;
- }
- // Compute pi index constants
- for (var x = 0; x < 5; x++) {
- for (var y = 0; y < 5; y++) {
- PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
- }
- }
- // Compute round constants
- var LFSR = 0x01;
- for (var i = 0; i < 24; i++) {
- var roundConstantMsw = 0;
- var roundConstantLsw = 0;
- for (var j = 0; j < 7; j++) {
- if (LFSR & 0x01) {
- var bitPosition = (1 << j) - 1;
- if (bitPosition < 32) {
- roundConstantLsw ^= 1 << bitPosition;
- } else /* if (bitPosition >= 32) */ {
- roundConstantMsw ^= 1 << (bitPosition - 32);
- }
- }
- // Compute next LFSR
- if (LFSR & 0x80) {
- // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
- LFSR = (LFSR << 1) ^ 0x71;
- } else {
- LFSR <<= 1;
- }
- }
- ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
- }
- }());
- // Reusable objects for temporary values
- var T = [];
- (function () {
- for (var i = 0; i < 25; i++) {
- T[i] = X64Word.create();
- }
- }());
- /**
- * SHA-3 hash algorithm.
- */
- var SHA3 = C_algo.SHA3 = Hasher.extend({
- /**
- * Configuration options.
- *
- * @property {number} outputLength
- * The desired number of bits in the output hash.
- * Only values permitted are: 224, 256, 384, 512.
- * Default: 512
- */
- cfg: Hasher.cfg.extend({
- outputLength: 512
- }),
- _doReset: function () {
- var state = this._state = []
- for (var i = 0; i < 25; i++) {
- state[i] = new X64Word.init();
- }
- this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
- },
- _doProcessBlock: function (M, offset) {
- // Shortcuts
- var state = this._state;
- var nBlockSizeLanes = this.blockSize / 2;
- // Absorb
- for (var i = 0; i < nBlockSizeLanes; i++) {
- // Shortcuts
- var M2i = M[offset + 2 * i];
- var M2i1 = M[offset + 2 * i + 1];
- // Swap endian
- M2i = (
- (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |
- (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)
- );
- M2i1 = (
- (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |
- (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)
- );
- // Absorb message into state
- var lane = state[i];
- lane.high ^= M2i1;
- lane.low ^= M2i;
- }
- // Rounds
- for (var round = 0; round < 24; round++) {
- // Theta
- for (var x = 0; x < 5; x++) {
- // Mix column lanes
- var tMsw = 0, tLsw = 0;
- for (var y = 0; y < 5; y++) {
- var lane = state[x + 5 * y];
- tMsw ^= lane.high;
- tLsw ^= lane.low;
- }
- // Temporary values
- var Tx = T[x];
- Tx.high = tMsw;
- Tx.low = tLsw;
- }
- for (var x = 0; x < 5; x++) {
- // Shortcuts
- var Tx4 = T[(x + 4) % 5];
- var Tx1 = T[(x + 1) % 5];
- var Tx1Msw = Tx1.high;
- var Tx1Lsw = Tx1.low;
- // Mix surrounding columns
- var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
- var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
- for (var y = 0; y < 5; y++) {
- var lane = state[x + 5 * y];
- lane.high ^= tMsw;
- lane.low ^= tLsw;
- }
- }
- // Rho Pi
- for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
- // Shortcuts
- var lane = state[laneIndex];
- var laneMsw = lane.high;
- var laneLsw = lane.low;
- var rhoOffset = RHO_OFFSETS[laneIndex];
- // Rotate lanes
- if (rhoOffset < 32) {
- var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
- var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
- } else /* if (rhoOffset >= 32) */ {
- var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
- var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
- }
- // Transpose lanes
- var TPiLane = T[PI_INDEXES[laneIndex]];
- TPiLane.high = tMsw;
- TPiLane.low = tLsw;
- }
- // Rho pi at x = y = 0
- var T0 = T[0];
- var state0 = state[0];
- T0.high = state0.high;
- T0.low = state0.low;
- // Chi
- for (var x = 0; x < 5; x++) {
- for (var y = 0; y < 5; y++) {
- // Shortcuts
- var laneIndex = x + 5 * y;
- var lane = state[laneIndex];
- var TLane = T[laneIndex];
- var Tx1Lane = T[((x + 1) % 5) + 5 * y];
- var Tx2Lane = T[((x + 2) % 5) + 5 * y];
- // Mix rows
- lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
- lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
- }
- }
- // Iota
- var lane = state[0];
- var roundConstant = ROUND_CONSTANTS[round];
- lane.high ^= roundConstant.high;
- lane.low ^= roundConstant.low;;
- }
- },
- _doFinalize: function () {
- // Shortcuts
- var data = this._data;
- var dataWords = data.words;
- var nBitsTotal = this._nDataBytes * 8;
- var nBitsLeft = data.sigBytes * 8;
- var blockSizeBits = this.blockSize * 32;
- // Add padding
- dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
- dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
- data.sigBytes = dataWords.length * 4;
- // Hash final blocks
- this._process();
- // Shortcuts
- var state = this._state;
- var outputLengthBytes = this.cfg.outputLength / 8;
- var outputLengthLanes = outputLengthBytes / 8;
- // Squeeze
- var hashWords = [];
- for (var i = 0; i < outputLengthLanes; i++) {
- // Shortcuts
- var lane = state[i];
- var laneMsw = lane.high;
- var laneLsw = lane.low;
- // Swap endian
- laneMsw = (
- (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |
- (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)
- );
- laneLsw = (
- (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |
- (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)
- );
- // Squeeze state to retrieve hash
- hashWords.push(laneLsw);
- hashWords.push(laneMsw);
- }
- // Return final computed hash
- return new WordArray.init(hashWords, outputLengthBytes);
- },
- clone: function () {
- var clone = Hasher.clone.call(this);
- var state = clone._state = this._state.slice(0);
- for (var i = 0; i < 25; i++) {
- state[i] = state[i].clone();
- }
- return clone;
- }
- });
- /**
- * Shortcut function to the hasher's object interface.
- *
- * @param {WordArray|string} message The message to hash.
- *
- * @return {WordArray} The hash.
- *
- * @static
- *
- * @example
- *
- * var hash = CryptoJS.SHA3('message');
- * var hash = CryptoJS.SHA3(wordArray);
- */
- C.SHA3 = Hasher._createHelper(SHA3);
- /**
- * Shortcut function to the HMAC's object interface.
- *
- * @param {WordArray|string} message The message to hash.
- * @param {WordArray|string} key The secret key.
- *
- * @return {WordArray} The HMAC.
- *
- * @static
- *
- * @example
- *
- * var hmac = CryptoJS.HmacSHA3(message, key);
- */
- C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
- }(Math));
- return CryptoJS.SHA3;
- }));
- },{"./core":33,"./x64-core":35}],35:[function(require,module,exports){
- ;(function (root, factory) {
- if (typeof exports === "object") {
- // CommonJS
- module.exports = exports = factory(require("./core"));
- }
- else if (typeof define === "function" && define.amd) {
- // AMD
- define(["./core"], factory);
- }
- else {
- // Global (browser)
- factory(root.CryptoJS);
- }
- }(this, function (CryptoJS) {
- (function (undefined) {
- // Shortcuts
- var C = CryptoJS;
- var C_lib = C.lib;
- var Base = C_lib.Base;
- var X32WordArray = C_lib.WordArray;
- /**
- * x64 namespace.
- */
- var C_x64 = C.x64 = {};
- /**
- * A 64-bit word.
- */
- var X64Word = C_x64.Word = Base.extend({
- /**
- * Initializes a newly created 64-bit word.
- *
- * @param {number} high The high 32 bits.
- * @param {number} low The low 32 bits.
- *
- * @example
- *
- * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
- */
- init: function (high, low) {
- this.high = high;
- this.low = low;
- }
- /**
- * Bitwise NOTs this word.
- *
- * @return {X64Word} A new x64-Word object after negating.
- *
- * @example
- *
- * var negated = x64Word.not();
- */
- // not: function () {
- // var high = ~this.high;
- // var low = ~this.low;
- // return X64Word.create(high, low);
- // },
- /**
- * Bitwise ANDs this word with the passed word.
- *
- * @param {X64Word} word The x64-Word to AND with this word.
- *
- * @return {X64Word} A new x64-Word object after ANDing.
- *
- * @example
- *
- * var anded = x64Word.and(anotherX64Word);
- */
- // and: function (word) {
- // var high = this.high & word.high;
- // var low = this.low & word.low;
- // return X64Word.create(high, low);
- // },
- /**
- * Bitwise ORs this word with the passed word.
- *
- * @param {X64Word} word The x64-Word to OR with this word.
- *
- * @return {X64Word} A new x64-Word object after ORing.
- *
- * @example
- *
- * var ored = x64Word.or(anotherX64Word);
- */
- // or: function (word) {
- // var high = this.high | word.high;
- // var low = this.low | word.low;
- // return X64Word.create(high, low);
- // },
- /**
- * Bitwise XORs this word with the passed word.
- *
- * @param {X64Word} word The x64-Word to XOR with this word.
- *
- * @return {X64Word} A new x64-Word object after XORing.
- *
- * @example
- *
- * var xored = x64Word.xor(anotherX64Word);
- */
- // xor: function (word) {
- // var high = this.high ^ word.high;
- // var low = this.low ^ word.low;
- // return X64Word.create(high, low);
- // },
- /**
- * Shifts this word n bits to the left.
- *
- * @param {number} n The number of bits to shift.
- *
- * @return {X64Word} A new x64-Word object after shifting.
- *
- * @example
- *
- * var shifted = x64Word.shiftL(25);
- */
- // shiftL: function (n) {
- // if (n < 32) {
- // var high = (this.high << n) | (this.low >>> (32 - n));
- // var low = this.low << n;
- // } else {
- // var high = this.low << (n - 32);
- // var low = 0;
- // }
- // return X64Word.create(high, low);
- // },
- /**
- * Shifts this word n bits to the right.
- *
- * @param {number} n The number of bits to shift.
- *
- * @return {X64Word} A new x64-Word object after shifting.
- *
- * @example
- *
- * var shifted = x64Word.shiftR(7);
- */
- // shiftR: function (n) {
- // if (n < 32) {
- // var low = (this.low >>> n) | (this.high << (32 - n));
- // var high = this.high >>> n;
- // } else {
- // var low = this.high >>> (n - 32);
- // var high = 0;
- // }
- // return X64Word.create(high, low);
- // },
- /**
- * Rotates this word n bits to the left.
- *
- * @param {number} n The number of bits to rotate.
- *
- * @return {X64Word} A new x64-Word object after rotating.
- *
- * @example
- *
- * var rotated = x64Word.rotL(25);
- */
- // rotL: function (n) {
- // return this.shiftL(n).or(this.shiftR(64 - n));
- // },
- /**
- * Rotates this word n bits to the right.
- *
- * @param {number} n The number of bits to rotate.
- *
- * @return {X64Word} A new x64-Word object after rotating.
- *
- * @example
- *
- * var rotated = x64Word.rotR(7);
- */
- // rotR: function (n) {
- // return this.shiftR(n).or(this.shiftL(64 - n));
- // },
- /**
- * Adds this word with the passed word.
- *
- * @param {X64Word} word The x64-Word to add with this word.
- *
- * @return {X64Word} A new x64-Word object after adding.
- *
- * @example
- *
- * var added = x64Word.add(anotherX64Word);
- */
- // add: function (word) {
- // var low = (this.low + word.low) | 0;
- // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
- // var high = (this.high + word.high + carry) | 0;
- // return X64Word.create(high, low);
- // }
- });
- /**
- * An array of 64-bit words.
- *
- * @property {Array} words The array of CryptoJS.x64.Word objects.
- * @property {number} sigBytes The number of significant bytes in this word array.
- */
- var X64WordArray = C_x64.WordArray = Base.extend({
- /**
- * Initializes a newly created word array.
- *
- * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
- * @param {number} sigBytes (Optional) The number of significant bytes in the words.
- *
- * @example
- *
- * var wordArray = CryptoJS.x64.WordArray.create();
- *
- * var wordArray = CryptoJS.x64.WordArray.create([
- * CryptoJS.x64.Word.create(0x00010203, 0x04050607),
- * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
- * ]);
- *
- * var wordArray = CryptoJS.x64.WordArray.create([
- * CryptoJS.x64.Word.create(0x00010203, 0x04050607),
- * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
- * ], 10);
- */
- init: function (words, sigBytes) {
- words = this.words = words || [];
- if (sigBytes != undefined) {
- this.sigBytes = sigBytes;
- } else {
- this.sigBytes = words.length * 8;
- }
- },
- /**
- * Converts this 64-bit word array to a 32-bit word array.
- *
- * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
- *
- * @example
- *
- * var x32WordArray = x64WordArray.toX32();
- */
- toX32: function () {
- // Shortcuts
- var x64Words = this.words;
- var x64WordsLength = x64Words.length;
- // Convert
- var x32Words = [];
- for (var i = 0; i < x64WordsLength; i++) {
- var x64Word = x64Words[i];
- x32Words.push(x64Word.high);
- x32Words.push(x64Word.low);
- }
- return X32WordArray.create(x32Words, this.sigBytes);
- },
- /**
- * Creates a copy of this word array.
- *
- * @return {X64WordArray} The clone.
- *
- * @example
- *
- * var clone = x64WordArray.clone();
- */
- clone: function () {
- var clone = Base.clone.call(this);
- // Clone "words" array
- var words = clone.words = this.words.slice(0);
- // Clone each X64Word object
- var wordsLength = words.length;
- for (var i = 0; i < wordsLength; i++) {
- words[i] = words[i].clone();
- }
- return clone;
- }
- });
- }());
- return CryptoJS;
- }));
- },{"./core":33}],"bignumber.js":[function(require,module,exports){
- 'use strict';
- module.exports = BigNumber; // jshint ignore:line
- },{}],"web3":[function(require,module,exports){
- var web3 = require('./lib/web3');
- web3.providers.HttpProvider = require('./lib/web3/httpprovider');
- web3.providers.IpcProvider = require('./lib/web3/ipcprovider');
- web3.eth.contract = require('./lib/web3/contract');
- web3.eth.namereg = require('./lib/web3/namereg');
- web3.eth.sendIBANTransaction = require('./lib/web3/transfer');
- // dont override global variable
- if (typeof window !== 'undefined' && typeof window.web3 === 'undefined') {
- window.web3 = web3;
- }
- module.exports = web3;
- },{"./lib/web3":9,"./lib/web3/contract":12,"./lib/web3/httpprovider":20,"./lib/web3/ipcprovider":22,"./lib/web3/namereg":25,"./lib/web3/transfer":30}]},{},["web3"])
- //# sourceMappingURL=web3-light.js.map
- `
|