{"snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"]}
{"snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"]}
{"snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"]}
{"snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"]}
{"snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"]}
{"snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"]}
{"snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"]}
{"snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"]}
{"snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"]}
{"functions": ["asset_update_ownership", "asset_update_functions", "asset_create", "asset_batch_create"], "snippet": "def asset_create(info, args):\n assert args['f'] == 'asset_create'\n\n tick = args['a'][0]\n assert type(tick) is str\n assert len(tick) > 0 and len(tick) < 42\n assert tick[0] in string.ascii_uppercase\n assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n sender = info['sender']\n addr = handle_lookup(sender)\n owner, _ = get('asset', 'owner', None, tick)\n assert not owner\n\n put(addr, 'asset', 'owner', addr, tick)\n put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n event('AssetCreated', [tick])\n\n\ndef asset_update_ownership(info, args):\n tick = args['a'][0]\n assert type(tick) is str\n assert len(tick) > 0 and len(tick) < 42\n assert tick[0] in string.ascii_uppercase\n assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n assert args['f'] == 'asset_update_ownership'\n functions, _ = get('asset', 'functions', [], tick)\n assert args['f'] in functions\n\n receiver = args['a'][1]\n sender = info['sender']\n addr = handle_lookup(sender)\n owner, _ = get('asset', 'owner', None, tick)\n assert owner == addr\n\n # DO THIS to change the owner using receiver's Zentra token\n functions, _ = get('asset', 'functions', None, tick)\n assert type(functions) is list\n assert functions\n put(receiver, 'asset', 'owner', receiver, tick)\n put(receiver, 'asset', 'functions', functions, tick)\n event('AssetOwnershipUpdated', [tick, receiver])\n\ndef asset_update_functions(info, args):\n tick = args['a'][0]\n assert type(tick) is str\n assert len(tick) > 0 and len(tick) < 42\n assert tick[0] in string.ascii_uppercase\n assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n assert args['f'] == 'asset_update_functions'\n functions, _ = get('asset', 'functions', [], tick)\n assert args['f'] in functions\n\n sender = info['sender']\n addr = handle_lookup(sender)\n owner, _ = get('asset', 'owner', None, tick)\n assert owner == addr\n\n functions = args['a'][1]\n assert type(functions) is list\n assert functions\n put(addr, 'asset', 'functions', functions, tick)\n event('AssetFunctionsUpdated', [tick, functions])\n\n\ndef asset_batch_create(info, args):\n assert args['f'] == 'asset_batch_create'\n\n sender = info['sender']\n addr = handle_lookup(sender)\n committee_members, _ = get('committee', 'members', [])\n committee_members = set(committee_members)\n assert addr in committee_members\n\n ticks = args['a'][0]\n assert type(ticks) is list\n for tick in ticks:\n assert type(tick) is str\n assert len(tick) > 0 and len(tick) < 42\n assert tick[0] in string.ascii_uppercase\n assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n addr = handle_lookup(sender)\n owner, _ = get('asset', 'owner', None, tick)\n\n if not owner:\n put(addr, 'asset', 'owner', addr, tick)\n put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n"}
{"votes": [], "snippets": ["6ca5dd4b49af31a27123ff3ff3622d81c1778f2e47255c5442c45064b9ed5ae8"], "functions": ["asset_create", "asset_update_ownership", "asset_update_functions", "asset_batch_create"]}
["asset_update_ownership", "asset_update_functions"]
"0xe1288759446298f250c3bce5616706d25525ba7f"
"0x78141a5a8C8Ba0595DC93c6dAb3A63270d6aA8B8"
797940913748321179498954721298671249725457349094951070033400900160484558896633276942593620719084540417952995985423957537276914989387908473860922136063891102892967479858736480043399243420053849865825790660069816488383892206510354143615367346420950854403671215282661073269764853318473705843343945490230958763251106137821608092837899033543352900773343833972376101943350386723783616817479111504223497063979268412701498002172819475721545833420252914962087565199776776041473363907565025197983374653346380377169299313754257295178084654259305091300776758065539885822182593851674992343714215376109246481060078340365989525218771711043326484073594139844583246858647379081564692390167973808909987073589116064212609687638660695176001486669538599472408793295719468027188979565950927923067135872718493745928792558227011342519143348481528063197774358619967782354677497646953593051465727100812345528244348513523145241172168624603384207910536284533784953181174333200276822061907920921416290000233555197880127856516230241576518071863696881506283907001061393158896170629534341300886552036005278005740906565092228613293677822405960868082842274595743030362395226438216775864140731992639798967021522764684573953071507992421977313201600644895242618728260601
"USDC"
59
{"functions": ["asset_update_ownership", "asset_update_functions", "asset_create", "asset_batch_create"], "snippet": "def asset_create(info, args):\n assert args['f'] == 'asset_create'\n\n tick = args['a'][0]\n assert type(tick) is str\n assert len(tick) > 0 and len(tick) < 42\n assert tick[0] in string.ascii_uppercase\n assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n sender = info['sender']\n addr = handle_lookup(sender)\n owner, _ = get('asset', 'owner', None, tick)\n assert not owner\n\n put(addr, 'asset', 'owner', addr, tick)\n put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n event('AssetCreated', [tick])\n\n\ndef asset_update_ownership(info, args):\n tick = args['a'][0]\n assert type(tick) is str\n assert len(tick) > 0 and len(tick) < 42\n assert tick[0] in string.ascii_uppercase\n assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n assert args['f'] == 'asset_update_ownership'\n functions, _ = get('asset', 'functions', [], tick)\n assert args['f'] in functions\n\n receiver = args['a'][1].lower()\n sender = info['sender']\n addr = handle_lookup(sender)\n owner, _ = get('asset', 'owner', None, tick)\n assert owner.lower() == addr\n\n # DO THIS to change the owner using receiver's Zentra token\n functions, _ = get('asset', 'functions', None, tick)\n assert type(functions) is list\n assert functions\n put(receiver, 'asset', 'owner', receiver, tick)\n put(receiver, 'asset', 'functions', functions, tick)\n event('AssetOwnershipUpdated', [tick, receiver])\n\ndef asset_update_functions(info, args):\n tick = args['a'][0]\n assert type(tick) is str\n assert len(tick) > 0 and len(tick) < 42\n assert tick[0] in string.ascii_uppercase\n assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n assert args['f'] == 'asset_update_functions'\n functions, _ = get('asset', 'functions', [], tick)\n assert args['f'] in functions\n\n sender = info['sender']\n addr = handle_lookup(sender)\n owner, _ = get('asset', 'owner', None, tick)\n assert owner == addr\n\n functions = args['a'][1]\n assert type(functions) is list\n assert functions\n put(addr, 'asset', 'functions', functions, tick)\n event('AssetFunctionsUpdated', [tick, functions])\n\n\ndef asset_batch_create(info, args):\n assert args['f'] == 'asset_batch_create'\n\n sender = info['sender']\n addr = handle_lookup(sender)\n committee_members, _ = get('committee', 'members', [])\n committee_members = set(committee_members)\n assert addr in committee_members\n\n ticks = args['a'][0]\n assert type(ticks) is list\n for tick in ticks:\n assert type(tick) is str\n assert len(tick) > 0 and len(tick) < 42\n assert tick[0] in string.ascii_uppercase\n assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n addr = handle_lookup(sender)\n owner, _ = get('asset', 'owner', None, tick)\n\n if not owner:\n put(addr, 'asset', 'owner', addr, tick)\n put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n"}
{"votes": [], "snippets": ["427754609975ef08e86f59023f8ef035e51b4c42df41c6a4325781f63d9fd92e"], "functions": ["asset_create", "asset_update_ownership", "asset_update_functions", "asset_batch_create"]}
null
297633006139117349552275302662100118893979066614764481816935641396558485816168043023346858725846828157229415852822992982454542106791042544491732520286568884869718247041564584318504451204233743205061423278060718517293787347969834650051100143013438653494172795393550887638825218184196149956840740493769348457738495092715586666797228572316584693528296973390463968318447523696512095031435507521576053641011294908799859059166395269112417227134807431177657016147630641943955580015372272465667865039234949889689889931845773532509066622715256132736647139632172834814095636644884139520495614069777271137554072429722799933272392550304284601665000984491024265900734095217156464613534644339234373292526178014261312903071082424199629519027586176459353731935596595019909762849401959280192945638064805454822077853171286512891438184402229701486601839798637657018257660938230630510505256301485927447862401832461296800013693614964849004999128842559829412209839951952856018700675395312916713079021479600072312313755964205748071249247638210556261736423528812476115060452024616946001932826617800498887592040894929815620740902183889054494501494084757036017308181829883497149848286175270903634972468341664576618706279802402884880337498882172186978531842394136513904747352877474286630625967459119488172436400776575176507281845118420213612278985662520223592300102215784147343227887760929839526596031191104516009490751062008952211586078029203943539956820040865748502681312188967863333558340626424698550357673983426458131438319917563795703533535595343188593078122762666728096370223239341617002181437806233203118208054880675256602852320418317205852449640580800218032728330733128480954750109036580101905202366383703253913233187241372269854570294872051097071024807873347148291814945196746328990771689808760132717481349604526321809876948046107899654365644240016809809536519908318495704629544594222936303300167297811797461157974440867231625021984334659996325808866673265786450149422582120844267561953101750237704569287475643004017773779023420897442192824303889136863193980770895246088672221892035816418958921991334280954082123216540105786894093205021138868947612956265301634904121998907886271705528171423447047056579739755875046488620621494422946014806072228361269577308882090952497931074507267881753025671971825633117590561303321208778982018817067720186108892035587941656748076872117579411368590782683011622983710542987358364187057219055115752921702742520456435930895558620713621376053935372449299
130296000000
9900000000000
null
181584477021143716469956668239704050905230806832992863156002225399591096623461719175013423870159035675768760188127395071334913438342515082428034244162932761213951572530215109428784876292851517979661219569771070305547195028301283275663062041596091920423105711081472060096630781859843879419021441221699485092093964006570856626959621413663973917779192297716593211613273287801214957308153573159591554607870846499298524109311135397899444038208288607092010710807159410462316380976124942325214646735732607396186092233997363262839945515380616551493435659998189373712806931768739066889285014329652927678119497663253330516170820360218802775165231986776431601509132755915308413368045510505504241954829785307787042406980040727159197735890620777483303040282752720896758529929669844970794185763351633523131470789700064727626068395831457143255462909055212420020853247291831913653051927447648086221408573962871580888338369750017644362488334710940853575048004515316844376420720050906641032911468595380835005635842753902467161006782553305058022117165337565712154259796482782592898591570927587756525777281908285321355662438752000678816243461023242541333731435462970199059317401585022184120672509349765502681524518762148482352901038623378705099845783534196658186766446607626993135962635187137960562129908328941512387566359514726791352276784490716587585867363670601241786577283012564713103738826817859453140393204007806366698738388518769311582680831484143670334766433981352403823244194844579681514028833118251445559770850183579921898197848035056367347813571462488329796302726509549396161870735114011276859215811416879476174812188382908283140878219690309415304325066964423147062976255652369349031325673236682196858686716584358894808182522030202728491789315830324292024130422797280782890480595856912746033820121377621415713890495970316333698762664329935380766472200594488865249780087901132468032450036273615662350355295009713996800105900350421336748620089736782374899823276864020661854513635482965892365943131696839409275481657731712365254881410884826699751640833759386392474818016299690723795957998565310809963013870072858964862222867582822691096580879333541090725200079724686498841435719759957744518252295613120480929617273695793127823908412864651623467895004720697118435419052369705799536173902736965159084804935142943507740126331781735664983870127800609411412354961126403634890571361268970295217243256927229346677635117992156689851104717480593329533768216085873467448092035752892822542
99999999999999999999999999999999999999999900000000000000
null
348381573995145925232924342273055416328674396786341128444610513132357176856446224200522875668114525637066383043185944996835528818270553534027152832876644650243481094154817925797700721733758645455838752392828000140689405428322346026203572731515765268896533758448830404443871664836777540858414793435185308841527883718156644978923001069555341036457779390309411411127805060766028773601490527572473757639481749147155163498071366609759353849917607795911047396949741379080111826182503527283415578768241273188450623514399055782553745394978190646837909359277706872175863955537960862685100559642111605706516019306020238209561789825181988560080821128037045683701290590526649892014525996837480585915981559451808458894575757644125544390725190500424214143328502578008457891727887427259238971870768244831525192257822710954071333947280239666809904062673525778236268224638246372193586912639409929258407164896764054369537074095734393270614462568246913040072931826092150207478346248643441118059876840027366954524260998966973560344216898215117146694152229783818377884136478500732042410544238864916793856983390359100302265619719451448902427656502131197196797718735389315331248118449371494698689178885446048259766722626529612701952895564795575666861181269420775163404792896994040758539607617499641227257926868908650466010490994425862999808966236308621481952913892199170385767362720215298929396030733542952110124177172521932545592836519948072506050544871867254378699330987751902672625268966895934451444670054540976011477510351571043960691370674161496725796706408655663795523670333736837292596213654223164079717977198925664688639195598236339662271914942933965766651043586192289702439654666297133370582803333340486144174116484776897681658575391069631518983197979622027592657966020966985368356867426387697647395085013852271015579149606091424895534169239927088129831293971138452899002026937342928378853112014976947844808158114915856902977219374046400157040067630331796337237252145287687254911878191414243295615773334461577047408355830654535586444139234379131193736817819934881460072154674351357043790214438589402265401734286938835620056024593809599991803989110168085984616643674494927880000226103211698827362544901230483744614951158804189884644450346330810660207057559996179955232720583133775507519438550411295596487388924596950117955888541793876444047422581073688011862415373456171430545942425640263614757689671149012406009627913450658035420635545083424456589784295891139721330645644575362470
null
226497665746917731508403044206381763973288603012038175013028308069490798334775853906962411854707965132107080382771425249823642932694002203997676624489882070187023720838391228970261814563534486305417513125123127522897687038890847557941153237205898998661667478851232278388518488889087042946862655319422522149544960320151677800173487567571162920720500707019233223209507140687248101247125840444364988887173850765947485243998973843814202856666247385185248065763874555034023915036177223189002586213071577704880695764546715968246693587223196012175495939475159443089151550899673548833552894307269810390420907644424367244398138836958296263204501416790020601479363367258587453149129248117513185190232133590960244610250188401642220838943982917768077833802759622305072799180144346015339903532898408909016910355820069839497609231681009817322502259303429727969153961158392962014088513693837379216559516914173576205425308565404021562265795262001805934057871655761449310303512460613064202309713058723454070725521994720368910967623722401515470651726546844575392387721544443505703199017746825050616471689130933076388449004197755671701594931928680146109371338558054128128384860917632255768366719398610168488641166431714901097711170789563012996560522561342630494484315515810746993615833163875362305826559096252067149207142990843664994546773810314141964674178552771445257911150564987288550883281202982792215234213111723903921210949763688939329477655270872608240053188966791859323449527754346201462304644338225673714401361064063267700043964861151165633350873969250313160461655459055991527184659684975714351954764889555196441082475781367874071813772784957510990190626406092966083125179584582861577220431772540714908454952971384042903707404397172138993820807212367673484093037255955145637752606222164212150602767542827117024488510530925717356164346029764391082216993231592793358940536854144018592604626349071587247901667025541306780739965550314533814079965964807198407251849026763886645188229560795498152053203971287350336650515495869643783229789276169402192561695661322800973412534765597564278997951441073804425560543625121821947638755261734900787962637431409913506986947024669258623014911953566383830001811168936917449064856187397564376284609642294041308936484946350243911218801379156783033770043031261015136579646782887712047588164942755367381785015060719324143398016380012880145060242415754237287066018200852500727766891788466329419399610820310283432251520209717542228027736879676011358
null
32769000000
null
158518318035768840590091776868106921138487500214754335377947944648392353963417541774287269330315216338634168751245033784122638990122255787782485423987278399357756486478450684283786893070822602292610518839829978207316149672128604798774448184997900671375968148890608116353750432708628674326548689161488555408034176440864820081693687584945781008115085467209387833139964276702016366033171396528431444798833774382781584156311871382122914454775927211697496765969268752195363701364912768008199559147124619775335268606594360962432968318284309131629923504664095722428471559870405885420558655358597823001835881594732969319854327742191450601256796088866458865457402191381616329929942991167916248247098182204745855480310750714193076354162141750879845518960494714289766921805896450108499597749344185439151414284743232541358117791077525171763377420142690852972802468862383433312995528877672960805384830682848289763303834667312423899367109760767513971595223030769583381188619600777958609639110091819075431746662069554659700153539729661185731659865036825036947941916187802043090048399382116098920906572924407639909783282828199570428352104531580136114327868713145330448676968353352774128518435500314565953470775647415282352042147667684017004580183797781851991023621189855057922533671527245732869608750545875215122860562441137017175672044197827115510951499246502413996422882754083888150424805757386278793647826145653153943772447872749395685623587104161235550328050781378023127469849312807226937427255653186141050089263942380917523172331006080202413037548428172706455315674542454137652282957600525130151106239638957299992560633750663728920002754740575555752477804069480911632596994369001176089356799562783416077112895451717766639158130285423971234721445715563593534646177532453821605669308934860090770617582674107718107333131259569369835671522095781656669494524757760132025408307260937826189189461933656751182883728816086538432188356030419045633857592565889455308514793551519009450872745033536355654055356121504676463028545416151317826524111680503232030480767464215393395319506206100921761564811144118975431170420811241397119140058734323433369402528358148806071921069891081215002420467772430557371936703849795287767372393352159191498705212162042287810287480255089033134877980700484966178470178595804286581133568725211765096233726379742855020481785236034475604218563541521095589480427832519100154177150785421775001734565572290995930167896620133014381227871890372614855853237390035060058
null
{"functions": ["privacy_exit", "privacy_deposit_cancel", "privacy_withdraw_cancel", "privacy_accept", "privacy_init", "privacy_send", "privacy_decline", "privacy_withdraw", "privacy_deposit", "privacy_enter", "privacy_send_cancel"], "snippet": "# Paillier helpers + privacy transfer flow (ZIP23)\n\ndef _egcd(a, b):\n x0, y0 = 1, 0\n x1, y1 = 0, 1\n while b != 0:\n q = a // b\n a, b = b, a % b\n x0, x1 = x1, x0 - q * x1\n y0, y1 = y1, y0 - q * y1\n return a, x0, y0\n\ndef _modinv(a, n):\n g, x, _ = _egcd(a, n)\n assert g == 1\n return x % n\n\ndef _homomorphic_add(pub, c1, c2):\n n = pub\n n2 = n * n\n return (c1 * c2) % n2\n\ndef _homomorphic_sub(pub, c1, c2):\n n = pub\n n2 = n * n\n inv = _modinv(c2, n2)\n return (c1 * inv) % n2\n\n\n# Elliptic Curve parameters for secp256k1\nP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F\nA = 0\nB = 7\nGx = 55066263022277343669578718895168534326250603453777594175500187360389116729240\nGy = 32670510020758816978083085130507043184471273380659243275938904335757337482424\nG = (Gx, Gy)\nN = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\n\ndef _inverse_mod(k, p):\n if k == 0:\n raise\n return pow(k, p - 2, p)\n\ndef _is_on_curve(point):\n if point is None:\n return True\n x, y = point\n return (y * y - (x * x * x + A * x + B)) % P == 0\n\ndef _point_add(point1, point2):\n if point1 is None:\n return point2\n if point2 is None:\n return point1\n x1, y1 = point1\n x2, y2 = point2\n if x1 == x2 and y1 != y2:\n return None\n if x1 == x2:\n m = (3 * x1 * x1 + A) * _inverse_mod(2 * y1, P)\n else:\n m = (y2 - y1) * _inverse_mod(x2 - x1, P)\n m %= P\n x3 = (m * m - x1 - x2) % P\n y3 = (m * (x1 - x3) - y1) % P\n return (x3, y3)\n\ndef _scalar_mult(k, point):\n result = None\n addend = point\n while k:\n if k & 1:\n result = _point_add(result, addend)\n addend = _point_add(addend, addend)\n k >>= 1\n return result\n\ndef _ecdsa_verify(msg_hash_hex, signature_hex, public_key_hex):\n assert msg_hash_hex.startswith('0x')\n assert signature_hex.startswith('0x')\n assert public_key_hex.startswith('0x')\n r = int(signature_hex[2:66], 16)\n s = int(signature_hex[66:130], 16)\n if not (1 <= r < N and 1 <= s < N):\n return False\n point = (int(public_key_hex[2:66], 16), int(public_key_hex[66:], 16))\n e = int(msg_hash_hex[2:], 16)\n w = _inverse_mod(s, N)\n u1 = (e * w) % N\n u2 = (r * w) % N\n q = _point_add(_scalar_mult(u1, G), _scalar_mult(u2, point))\n if q is None:\n return False\n x, y = q\n return r == x % N\n\ndef _ecdsa_recover(msg_hash_hex, signature_hex):\n assert msg_hash_hex.startswith('0x')\n assert signature_hex.startswith('0x')\n r = int(signature_hex[2:66], 16)\n s = int(signature_hex[66:130], 16)\n z = int(msg_hash_hex[2:], 16)\n\n if len(signature_hex[2:]) == 130:\n v = int(signature_hex[130:], 16)\n if v >= 27:\n recovery_id = v - 27\n else:\n recovery_id = v\n recovery_ids = [recovery_id]\n else:\n recovery_ids = [0, 1]\n\n for recovery_id in recovery_ids:\n for j in range(2):\n x = r + j * N\n if x >= P:\n continue\n\n y_squared = (pow(x, 3, P) + A * x + B) % P\n y = pow(y_squared, (P + 1) // 4, P)\n\n if y % 2 != recovery_id:\n y = P - y\n\n point = (x, y)\n if not _is_on_curve(point):\n continue\n\n r_inv = _inverse_mod(r, N)\n u1 = (-z * r_inv) % N\n u2 = (s * r_inv) % N\n\n q = _point_add(_scalar_mult(u1, G), _scalar_mult(u2, point))\n\n if q is None:\n continue\n\n public_key_hex = f\"0x{q[0]:064x}{q[1]:064x}\"\n if _ecdsa_verify(msg_hash_hex, signature_hex, public_key_hex):\n return public_key_hex\n\n return None\n\ndef _pubkey_to_address(public_key_hex):\n public_key_bytes = bytes.fromhex(public_key_hex[2:])\n address_bytes = keccak(public_key_bytes)[-20:]\n return '0x' + address_bytes.hex()\n\ndef _message_hash(payload):\n payload_hash = keccak(text=payload)\n prefix = b\"\\x19Ethereum Signed Message:\\n32\"\n return keccak(prefix + payload_hash)\n\ndef _addr_recover(msg, signature_hex):\n if not signature_hex.startswith('0x'):\n signature_hex = '0x' + signature_hex\n msg_hash = _message_hash(msg)\n msg_hash_hex = '0x' + msg_hash.hex()\n public_key_hex = _ecdsa_recover(msg_hash_hex, signature_hex)\n if not public_key_hex:\n return False\n recovered = _pubkey_to_address(public_key_hex)\n return recovered.lower()\n\ndef _resolve_account(addr):\n addr = addr.lower()\n assert len(addr) <= 42\n if len(addr) == 42:\n assert addr.startswith('0x')\n assert set(addr[2:]) <= set(string.digits + 'abcdef')\n else:\n assert len(addr) > 4\n\n if len(addr) == 42:\n return handle_lookup(addr)\n return addr\n\ndef _check_tick(tick):\n assert type(tick) is str\n assert len(tick) > 0 and len(tick) < 42\n assert tick[0] in string.ascii_uppercase\n assert set(tick) <= set(string.ascii_uppercase + string.digits + '_')\n\n\ndef _get_pubkey(privacy_tick):\n pub, _ = get(privacy_tick, 'privacy_pub', None)\n if pub is None:\n return None\n return int(pub)\n\n\ndef privacy_init(info, args):\n assert args['f'] == 'privacy_init'\n\n tick = args['a'][0]\n _check_tick(tick)\n privacy_tick = args['a'][1]\n _check_tick(privacy_tick)\n provider_addr = args['a'][2]\n paillier_pub = int(args['a'][3])\n\n sender = info['sender']\n\n existing_provider, _ = get(privacy_tick, 'privacy_provider', None)\n if existing_provider is not None:\n return\n\n put(provider_addr, privacy_tick, 'tick', tick)\n put(provider_addr, privacy_tick, 'transaction_count', 0)\n put(provider_addr, privacy_tick, 'privacy_provider', provider_addr)\n put(provider_addr, privacy_tick, 'privacy_pub', int(paillier_pub))\n\n\ndef privacy_update(info, args):\n assert args['f'] == 'privacy_update'\n\n # TODO\n\n\ndef privacy_deposit(info, args):\n assert args['f'] == 'privacy_deposit'\n\n privacy_tick = args['a'][0]\n _check_tick(privacy_tick)\n tick, _ = get(privacy_tick, 'tick', None)\n _check_tick(tick)\n\n functions, _ = get('asset', 'functions', [], tick)\n assert args['f'] in functions\n functions, _ = get('asset', 'functions', [], privacy_tick)\n assert args['f'] in functions\n\n sender = info['sender']\n addr = handle_lookup(sender)\n\n existing_deposit, _ = get(privacy_tick, 'privacy_deposit', None, addr)\n if existing_deposit:\n return\n\n amount = int(args['a'][1])\n assert amount >= 0\n\n amount_cipher = int(args['a'][2])\n assert amount_cipher >= 0\n\n balance, _ = get(tick, 'balance', 0, f'{sender}')\n assert balance >= amount\n balance_updated = balance - amount\n put(sender, tick, 'balance', balance_updated, f'{sender}')\n\n transaction_id, privacy_tick_owner = get(privacy_tick, 'transaction_count', 0)\n transaction_id += 1\n put(privacy_tick_owner, privacy_tick, 'transaction_count', transaction_id)\n\n put(addr, privacy_tick, 'privacy_deposit', f'{str(amount)},{str(amount_cipher)},{str(transaction_id)}', f'{addr}')\n event('PrivacyDeposit', [privacy_tick, addr, amount, amount_cipher, transaction_id])\n\n\ndef privacy_deposit_cancel(info, args):\n assert args['f'] == 'privacy_deposit_cancel'\n\n privacy_tick = args['a'][0]\n _check_tick(privacy_tick)\n tick, _ = get(privacy_tick, 'tick', None)\n _check_tick(tick)\n\n functions, _ = get('asset', 'functions', [], tick)\n assert args['f'] in functions\n functions, _ = get('asset', 'functions', [], privacy_tick)\n assert args['f'] in functions\n\n sender = info['sender']\n addr = handle_lookup(sender)\n\n deposit_info, _ = get(privacy_tick, 'privacy_deposit', None, addr)\n if not deposit_info:\n return\n\n parts = deposit_info.split(',')\n assert len(parts) == 3\n amount = int(parts[0])\n amount_cipher = int(parts[1])\n transaction_id = int(parts[2])\n\n balance, _ = get(tick, 'balance', 0, sender)\n balance_updated = balance + amount\n put(sender, tick, 'balance', balance_updated, sender)\n\n put(addr, privacy_tick, 'privacy_deposit', None, addr)\n\n event('PrivacyDepositCancel', [privacy_tick, addr, amount, amount_cipher, transaction_id])\n\n\ndef privacy_enter(info, args):\n assert args['f'] == 'privacy_enter'\n\n privacy_tick = args['a'][0]\n _check_tick(privacy_tick)\n tick, _ = get(privacy_tick, 'tick', None)\n _check_tick(tick)\n\n functions, _ = get('asset', 'functions', [], privacy_tick)\n assert args['f'] in functions\n functions, _ = get('asset', 'functions', [], tick)\n assert args['f'] in functions\n\n sender = info['sender']\n transaction_id = int(args['a'][1])\n signature_hex = args['a'][2]\n\n pub = _get_pubkey(privacy_tick)\n assert pub is not None\n\n deposit_info, owner = get(privacy_tick, 'privacy_deposit', 0, f'{sender}')\n assert deposit_info is not None\n parts = deposit_info.split(',')\n assert len(parts) == 3\n amount = int(parts[0])\n amount_cipher = int(parts[1])\n tx_id = int(parts[2])\n assert tx_id == transaction_id\n put(owner, privacy_tick, 'privacy_deposit', None, f'{sender}')\n\n provider_addr, _ = get(privacy_tick, 'privacy_provider', None)\n msg_to_sign = f'{privacy_tick},privacy_deposit,{str(amount)},{str(amount_cipher)},{str(transaction_id)}'\n\n if provider_addr.lower() != _addr_recover(msg_to_sign, signature_hex):\n return\n\n balance, _ = get(tick, 'balance', 0, f'{privacy_tick}')\n assert balance >= 0\n balance_updated = balance + amount\n put(sender, tick, 'balance', balance_updated, f'{privacy_tick}')\n\n balance_cipher, _ = get(privacy_tick, 'privacy_balance', 1, f'{sender},1')\n balance_cipher_updated = _homomorphic_add(pub, int(balance_cipher), amount_cipher)\n put(sender, privacy_tick, 'privacy_balance', balance_cipher_updated, f'{sender},1')\n\n event('PrivacyEnter', [tick, sender, balance_cipher_updated])\n\n\ndef privacy_withdraw(info, args):\n assert args['f'] == 'privacy_withdraw'\n\n privacy_tick = args['a'][0]\n _check_tick(privacy_tick)\n functions, _ = get('asset', 'functions', [], privacy_tick)\n assert args['f'] in functions\n\n sender = info['sender']\n from_addr = handle_lookup(sender)\n\n existing_withdraw, _ = get(privacy_tick, 'privacy_withdraw', None, from_addr)\n if existing_withdraw:\n return\n\n # to_addr = _resolve_account(args['a'][1])\n amount = int(args['a'][1])\n amount_cipher = int(args['a'][2])\n\n pub = _get_pubkey(privacy_tick)\n assert pub is not None\n\n balance_key = f'{from_addr},1'\n balance_cipher, _ = get(privacy_tick, 'privacy_balance', 1, balance_key)\n \n balance_cipher_updated = _homomorphic_sub(pub, int(balance_cipher), amount_cipher)\n put(sender, privacy_tick, 'privacy_balance', balance_cipher_updated, balance_key)\n\n transaction_id, privacy_tick_owner = get(privacy_tick, 'transaction_count', 0)\n transaction_id += 1\n put(privacy_tick_owner, privacy_tick, 'transaction_count', transaction_id)\n\n put(sender, privacy_tick, 'privacy_withdraw', f'{str(balance_cipher)},{str(amount)},{str(amount_cipher)},{str(transaction_id)}', from_addr)\n\n event('PrivacyWithdraw', [privacy_tick, balance_cipher, amount, amount_cipher, transaction_id])\n\n\ndef privacy_withdraw_cancel(info, args):\n assert args['f'] == 'privacy_withdraw_cancel'\n\n privacy_tick = args['a'][0]\n _check_tick(privacy_tick)\n functions, _ = get('asset', 'functions', [], privacy_tick)\n assert args['f'] in functions\n\n sender = info['sender']\n from_addr = handle_lookup(sender)\n\n withdraw_info, _ = get(privacy_tick, 'privacy_withdraw', None, from_addr)\n if not withdraw_info:\n return\n\n pub = _get_pubkey(privacy_tick)\n assert pub is not None\n\n parts = withdraw_info.split(',')\n assert len(parts) == 4\n addr = parts[0]\n amount = int(parts[1])\n amount_cipher = int(parts[2])\n transaction_id = int(parts[3])\n\n balance_key = f'{from_addr},1'\n balance_cipher, _ = get(privacy_tick, 'privacy_balance', 1, balance_key)\n balance_cipher_updated = _homomorphic_add(pub, int(balance_cipher), amount_cipher)\n put(sender, privacy_tick, 'privacy_balance', balance_cipher_updated, balance_key)\n\n put(sender, privacy_tick, 'privacy_withdraw', None, from_addr)\n\n event('PrivacyWithdrawCancel', [privacy_tick, from_addr, amount, amount_cipher, transaction_id])\n\n\ndef privacy_exit(info, args):\n assert args['f'] == 'privacy_exit'\n\n privacy_tick = args['a'][0]\n _check_tick(privacy_tick)\n tick, _ = get(privacy_tick, 'tick', None)\n _check_tick(tick)\n\n functions, _ = get('asset', 'functions', [], tick)\n assert args['f'] in functions\n functions, _ = get('asset', 'functions', [], privacy_tick)\n assert args['f'] in functions\n\n sender = info['sender']\n transaction_id = int(args['a'][1])\n signature_hex = args['a'][2]\n\n withdraw_info, _ = get(privacy_tick, 'privacy_withdraw', None, sender)\n if not withdraw_info:\n return\n\n parts = withdraw_info.split(',')\n assert len(parts) == 4\n balance_cipher = parts[0]\n amount = int(parts[1])\n amount_cipher = int(parts[2])\n tx_id = int(parts[3])\n assert tx_id == transaction_id\n\n provider_addr, _ = get(privacy_tick, 'privacy_provider', None)\n msg_to_sign = f'{privacy_tick},privacy_withdraw,{str(amount)},{str(transaction_id)}'\n\n if provider_addr.lower() != _addr_recover(msg_to_sign, signature_hex):\n return\n\n pool_balance, _ = get(tick, 'balance', 0, privacy_tick)\n assert pool_balance >= amount\n put(sender, tick, 'balance', pool_balance - amount, privacy_tick)\n\n balance, _ = get(tick, 'balance', 0, sender)\n put(sender, tick, 'balance', balance + amount, sender)\n\n put(sender, privacy_tick, 'privacy_withdraw', None, sender)\n\n event('PrivacyExit', [privacy_tick, sender, amount_cipher])\n\n\ndef privacy_send(info, args):\n assert args['f'] == 'privacy_send'\n\n privacy_tick = args['a'][0]\n _check_tick(privacy_tick)\n functions, _ = get('asset', 'functions', [], privacy_tick)\n assert args['f'] in functions\n\n sender = info['sender']\n from_addr = handle_lookup(sender)\n from_subaccount = int(args['a'][1])\n assert from_subaccount > 0\n to_addr = _resolve_account(args['a'][2])\n to_subaccount = int(args['a'][3])\n assert to_subaccount > 0\n amount_cipher = int(args['a'][4])\n\n send_info, _ = get(privacy_tick, 'privacy_send', None, f'{from_addr},{str(from_subaccount)}')\n if send_info:\n return\n\n pub = _get_pubkey(privacy_tick)\n assert pub is not None\n\n balance_cipher, _ = get(privacy_tick, 'privacy_balance', from_subaccount, f'{from_addr},{str(from_subaccount)}')\n balance_cipher_updated = _homomorphic_sub(pub, int(balance_cipher), amount_cipher)\n put(sender, privacy_tick, 'privacy_balance', balance_cipher_updated, f'{from_addr},{str(from_subaccount)}')\n\n transaction_id, privacy_tick_owner = get(privacy_tick, 'transaction_count', 0)\n transaction_id += 1\n put(privacy_tick_owner, privacy_tick, 'transaction_count', transaction_id)\n put(sender, privacy_tick, 'privacy_send', f'{str(balance_cipher)},{str(amount_cipher)},{to_addr},{str(to_subaccount)},{str(transaction_id)}', f'{sender},{str(from_subaccount)}')\n\n event('PrivacySend', [privacy_tick, from_addr, from_subaccount, to_addr, to_subaccount, balance_cipher, amount_cipher, transaction_id])\n\n\ndef privacy_send_cancel(info, args):\n assert args['f'] == 'privacy_send_cancel'\n\n privacy_tick = args['a'][0]\n _check_tick(privacy_tick)\n functions, _ = get('asset', 'functions', [], privacy_tick)\n assert args['f'] in functions\n\n sender = info['sender']\n from_addr = handle_lookup(sender)\n from_subaccount = int(args['a'][1])\n assert from_subaccount > 0\n\n send_info_key = f'{from_addr},{str(from_subaccount)}'\n send_info, _ = get(privacy_tick, 'privacy_send', None, send_info_key)\n if not send_info:\n return\n\n pub = _get_pubkey(privacy_tick)\n assert pub is not None\n\n parts = send_info.split(',')\n assert len(parts) == 5\n amount_cipher = int(parts[1])\n transaction_id = int(parts[4])\n\n balance_key = f'{from_addr},{str(from_subaccount)}'\n balance_cipher, _ = get(privacy_tick, 'privacy_balance', 1, balance_key)\n balance_cipher_updated = _homomorphic_add(pub, int(balance_cipher), amount_cipher)\n put(sender, privacy_tick, 'privacy_balance', balance_cipher_updated, balance_key)\n put(sender, privacy_tick, 'privacy_send', None, send_info_key)\n\n event('PrivacySendCancel', [privacy_tick, from_addr, from_subaccount, balance_cipher_updated, amount_cipher, transaction_id])\n\n\ndef privacy_accept(info, args):\n assert args['f'] == 'privacy_accept'\n\n privacy_tick = args['a'][0]\n _check_tick(privacy_tick)\n functions, _ = get('asset', 'functions', [], privacy_tick)\n assert args['f'] in functions\n\n from_addr = _resolve_account(args['a'][1])\n from_subaccount = int(args['a'][2])\n assert from_subaccount > 0\n signature_hex = args['a'][3]\n to_subaccount = int(args['a'][4])\n sender = info['sender']\n\n send_info, _ = get(privacy_tick, 'privacy_send', None, f'{from_addr},{str(from_subaccount)}')\n if not send_info:\n return\n parts = send_info.split(',')\n assert len(parts) == 5\n # senderbalance_cipher = int(parts[0])\n amount_cipher = int(parts[1])\n to_addr = parts[2]\n to_subaccount = int(parts[3])\n transaction_id = int(parts[4])\n assert to_addr == sender\n\n pub = _get_pubkey(privacy_tick)\n assert pub is not None\n\n provider_addr, _ = get(privacy_tick, 'privacy_provider', None)\n msg_to_sign = f'{privacy_tick},privacy_send,{from_addr},{str(from_subaccount)},{str(transaction_id)}'\n if provider_addr.lower() != _addr_recover(msg_to_sign, signature_hex):\n return\n\n balance_cipher, _ = get(privacy_tick, 'privacy_balance', 1, f'{to_addr},{str(to_subaccount)}')\n balance_cipher_updated = _homomorphic_add(pub, int(balance_cipher), amount_cipher)\n put(to_addr, privacy_tick, 'privacy_balance', balance_cipher_updated, f'{to_addr},{str(to_subaccount)}')\n put(from_addr, privacy_tick, 'privacy_send', None, f'{from_addr},{str(from_subaccount)}')\n\n event('PrivacyAccept', [privacy_tick, to_subaccount, balance_cipher_updated, amount_cipher, transaction_id])\n\n\ndef privacy_decline(info, args):\n assert args['f'] == 'privacy_decline'\n\n privacy_tick = args['a'][0]\n _check_tick(privacy_tick)\n from_addr = _resolve_account(args['a'][1])\n from_subaccount = int(args['a'][2])\n assert from_subaccount > 0\n sender = info['sender']\n\n send_info, _ = get(privacy_tick, 'privacy_send', None, f'{from_addr},{str(from_subaccount)}')\n if not send_info:\n return\n parts = send_info.split(',')\n assert len(parts) == 5\n amount_cipher = int(parts[1])\n to_addr = parts[2]\n transaction_id = int(parts[4])\n assert to_addr == sender\n\n pub = _get_pubkey(privacy_tick)\n assert pub is not None\n\n balance_cipher, _ = get(privacy_tick, 'privacy_balance', 1, f'{from_addr},{str(from_subaccount)}')\n balance_cipher_updated = _homomorphic_add(pub, int(balance_cipher), amount_cipher)\n put(from_addr, privacy_tick, 'privacy_balance', balance_cipher_updated, f'{from_addr},{str(from_subaccount)}')\n put(from_addr, privacy_tick, 'privacy_send', None, f'{from_addr},{str(from_subaccount)}')\n\n event('PrivacyDecline', [privacy_tick, from_addr, from_subaccount, balance_cipher_updated, amount_cipher, transaction_id])\n\n"}
{"votes": [], "snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"], "functions": ["privacy_init", "privacy_deposit", "privacy_deposit_cancel", "privacy_enter", "privacy_send", "privacy_send_cancel", "privacy_accept", "privacy_withdraw", "privacy_withdraw_cancel", "privacy_exit"]}
{"votes": [], "snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"], "functions": ["privacy_init", "privacy_deposit", "privacy_deposit_cancel", "privacy_enter", "privacy_send", "privacy_send_cancel", "privacy_accept", "privacy_decline", "privacy_withdraw", "privacy_withdraw_cancel", "privacy_exit"]}
{"snippets": ["3b531f43aeb51b13e57b9b7943c0abe2ac7f4ad66cbfe578668d5ba2210223b8"]}
553262585582137726859932838174076601356111277227730202732021588687202755631289842658423345404642614971919106610671466857869226961733340798935327631419608261710530390094840971533564859696887437896976262777748725929033394077469889961029417335042240584187776071532933084527634884321593092115136857478954566996940131496837960030580830088637344985401438789132890030064073508476403057868927161522037665770917723919322556414242731405270678926616330329211822064120367041246193031033009741317581418531059324482323487542474919893314455708682861447704481375001959935187535014764988910480383804346871213641498663787529639039028422935209906811519828528754722298113429873602177223713650004137093224045578593011512954064785724174253085610225483045383658873013909969558406802552995855116577874443134957811906699637298573962034752598482059094225646173428759887510331294501640974602424755530230330460183956532494711788004180282715836766429580389493222288798636029757357100096430099711328907047878240178675743808217176450875729229359271550122058101542042039559166299683991027715345442077470015534777699668361592624685105124495763546712653250078101815064670450429131231305236162355964251705201352738132338378124633061089397604230217539098653188339815819570343934780116435605130041329970540541918182673148635980223786472598099995993586741815156463585430800259173883754725500844740787471424691644517865725712423140543076799610778003251037525672638076363396569227588286805373627023710124435395592610156964099283803062297951531971372408219578481992555937402542185689333873412453268133385833319089502944453045100077361959545137274683492374131682172156088766812860540361911661441864293743806997187968253315965803992348106039742352880573206703064083124409056376023084454089953268442788023659473728011238773290224975243596396512690522979549899404908042742107842881488355238709067562960433949820096434260222210663648064159180975282166749109284800921099500551450198190506202545769644009477195223518743756156169752176876372361672819349405599511468816873922413028670696922483817283410571615071431925977962224511191428578997694889674434845046057246270027950425407148003317013518085528889896410392719433048770907285648613852845382524541115474807282533612769076636912844010319114191827469293038657206147508330754132887897353858165729315607031595582542258854281953751726787790153550715384912205475387807974123201999584173480719364567720282629783091936590185403698098742795103145496804625177511806583540
null
null
366679738304304666528414817071786600341349846147400040595862677108533599031056704623869518051355470464813956668069452350432166516386258895820556610885618301513690328120776936238271414149860848595592220632893956334530895637812143177692798332439746236845770553732274767701238538178584701275308802726219933359886334295618947512458539191907065443254882727833261126613457182454234364691832090369025435753273649979971849731108186147015128725073801324344603917411016867138035343038795737201673110873176732081852973150245274138763593519438763438970546988123009192415537155033619196970327587067282423157285802143954295464979285790392357737957103111056787772194557159616337876923190540432839620736720764204576396808020659496179067484744403239302750537884420102222288262717231980622091140179085604785882914412148536126511958973007838631347901000643495772729494053045670679544966738325648906612017130482866531062752969476944072650640110828367074917354061863215278571386767594379512953542237196586179047016981411975687510296673940919678581070737452671907187766105830204567387980082518728061821827682050142289751224050850322003200009580387455924289669664400184762799327608224629778176627661633299747715675274351681524223699477468913825193514635709657048195443562250561932423653388077691201671345787755524277127054537086241648854806527119661322765363116851361800530262462700826651137740864334374010821008314560303925361179294040417732389347133411720092378097747188517750399080783169192384647464731694130937007963927530296817983088700999846753314257643096644480350014899706147917768973848173023881684333779734771980268316568770089636299267886099261991518132673186635827858172523089433939796854034090298132030395621708947496118725305506118387620887598364908566548950161662669813156053182717682432776651563849657807227702860389905150089457687186173341555732511621625434091457505007473488096362845132198612834400770841611998771617055800081847317874915369529946265549799178657816155469360174534521176204028646121174323178622002935143619735265756260730391578971140802510196498302018227774612093709743647935643978835527392665821702548220177223830932104964488037965455005539720275983150796934381866669083673975332075606690503079428050738874993108985383155632485894000806592033073803943932930954005904627867599032518985787090374904049191168415276629438136281161535148909641659208716630324482626659541477360685139028989583560119868456889830642140164595792029379962850381276117867752541261984
null
null
20350000000
null
320805790266565044226362289608405024858982630490207048881302630237315551687699275663161865413157371864146658262365129063671603463281208640259685293455825829407033233192423761221507876354447892289651346791586937376808965046937090644835594792393189971896974702543760783817757804869741506136865723703936027183260716506185316791165504455584327220962478449682890250257847140805832373418080651025989942852876641471217231399854036381642031630533379321764459619390526671013494596836927816174960685618708900017773174278603801838780151183277068273518616565225761074162688806801251225371561666599907619257537305995582115637384240489608153034513809031111573490770839475751296530927343918884834030633961826520539204576567109189717984349823822431142686287437895612240437428523911462456809518049285034872296104198552360540880402446398091561765429953076746354149819658882184104287150338203317949121274193179320987319985297641436521690727596687865670980550934519001956737232514809837145442563923574731807332942169054170272135911022883964005934543167437677853550790715283034924243390022766485801780513030021399799613795820056509346274234126452281780384170320586301563313604613794718814206665619536957071997584830254363119685605535923942371295681831774681984579877390127668504547277153297637237642029576662783576327812498699644622875565455115471101995846900350033377062735230831099344589057803702429799363812625480404953532794551756957654437197241737932633247831049677227514806017923852569682254333056825775846504955287501708436640259432788355126175953443445119478396112105241489664689461071755131395736120812840530900738471496769887117328426657058955118530600255933963374386746280975736369074573658825983530869882260674069672613576901552373815677311689376449041121136282669603030184148160775263055449528233599421952289725664302615111285173421862224734389901448983859772005521876560533973445676074295812227706895483710721192420218983983621705609431126608203605410509017914949814078466560577439693467432448682671848138598563500642638915480107881623472684983959581114580653935979321912639221909730730482847149020759933641195371751052380517526645528879355282095221459791196753366144298362954953897676758242983256302798011730586794683470449134317335020138773730367419432762944437027956996589692332454060704570509395798644627383711142163521541480052353851728366057302865016724011559059251527940393473260071954969444072681517342543512085107552113889448018910956836143347228465216554848016104
null
105000000
null
470296369318626168758320952124897740378389837996418978992208989584787875754778332810846923000932349085377220265177825351075350972590210961872385478429972086810433823235381390759560264458401093095759131358900260663286656034274896496320464617651668976967160416635521143831515221139710724433187912792849370044483655403739661530271630289194464682045926679054375568418894514043611170873195849258490576996280311398871502099022934333307850564565026361219466634998442411223040228636998104884761124253254520829965859278197718639732573433351622988475066966755868378139361946826133095199873839953820592487935039407039918301636174195834507863074740737679357449613617215518748816714923337482520507195336328689584340524436063635049381255753427518858991789946739482853541990260586744888307332995194443100040904184833729060350664132261761563782620461641286157842856596616948546725259397384576438944282647126119935019246949713505048630548932001335405874800572363984283029873636473599833612743927354780237270043720579352945710774822881866133720365370349283451530282536801289128012321095186008172313987538108934263320407343895017789884998500379448747782450630108015796986604291121692577088307311866503182827970321314878743990275006655957480637287739620010187206886039041663421870922801127562595068709149738547219799142498668752708291280543351382667822581450080097625114955731896895899786897302175716232202785587420513079139473442688632586032872838774199570834074900969203489926782496585317615502910573980263638464261829332471075643737151985551289249158900004324039506953002079275930307269268988693775381564974572992787132293867903068138971745700458819731354220176185176904268754894913596890020157861760338638808293677974484899489683545022353595306074961851298612171567867182062582826547114020398524978653456103271803873569318905542098534298894903637000410210371937609912198106404436470013181307266045595178507964811364222351034458644166870915494359315252409556115230915606329738522998752973178040762830013869554140979213688844475189315306564137748283754706705661060536259623362560459630267766818736268129416358086381892964010895358883160896662850378762682266165837947200186273404662573764778459897955739241920002922069841185955598484932515293368671115669906341061080151205903565275781975972232468976655348983713742660973331206397880794704591441217550100835762758713057962524703893714014554061797792713864565420826965531173479230124582749125891208319698021926853292893141757424293231695
null
300000000
null
444720592545591548421210767156531664239741600484160120085892934576382973993067454924885695453841440418934619221691508993032365106368642024843012838563753917176153630586487843958060799895400607210342722565147038707003632963479911809885363159432817213765066433360899534268874600526325951625441815667272062186625211070702564156150101042183299173045323329664449769995372707325662508743644306500381054047987299848283485996382857126519180067730814747393590460368851021063893946200454295982018582578802049621028736427247987380709260519567501431198646447142455710285919461194973367760460909148100781867301890440923204338079712052399123368505419445531363792983661035400714040786130852632155124532322207848374602280964613383752653180802245614438977514842724859431653850703522825099972313208327798920263766465599621543632802622576994031443708022617405309386579837054939195824376696155730742917465135803478790769068436478520843506608656596877869564894839865939970860961447066771454838271461347156620994367535877872628101520417933550603372789688434814647735990203876081144327227820227124183822297055106925036360670937238356207612316574217129791518020743553524324042353217078450126057346890278900289197126862635207708591501349637460402907916942424576248316271535420946179771062225334527579725553694051905323979146323831335056921296110509900445015255600155902269355876921265491617359497726592708812607602525713136903937042435181334488809884600096754756566809238803555781757935805174343661453428848334021847094763353360176908013769918982036662571032307332017404916292553308218503385724442686123728832528949344484749680307199622393041354704375346040711227742170799759474109448703394858784045399407876507405561840821971649751711779894926497377547952523395727763247385688661139059638764917750056209155335337783409196032010871557687792967378325787719334895208173098484865156899159277166123595516435285176998399947948715272508362012468488827954995850180762325481555164921213467228631276637283931529971625180103763541676928193353360370106613082718966021578272209097402917559484924605213382177944759079277484216639888725271553181408913818387751380351428867831906430549830969563452760058462065466587204024087386432985735729596913379666079223181420323550219363198717400213860038591345054895973547138213872905890040842814161052511542941134609384082891428910842943057950553135859406658365581183919773398947282354850869210919691535082524083544892291957411427882283475177480918658266663775701112
800000000
null
540260173187849312034840864723152488278894814436651243741514697654317680858258404558637036639238974654065418448150363103273774580133483844940400101767906021877847195707226988667531704755734887316917273899301878804106347151105454280473438718242331383571392049827356279203935222205055057468040248874259302216254328973586830802872915104854077755018526832637042420562384913735232418728599451125978917399153243426110998914480176448052679044755455206881520711148350225673656918884190496307269431106707225642215128989542156448717241779699191207923058535169726569729293287882570578254104213015100571872060030836497023316448312188234793888452120728673601951814785064176025021489235844356773653052316462066104658712837402504533879882369220537031121669363243996348654369273853938015756754340965687273311866450769218177967641108677320176736688382281283763026766161462791030669649168538927954211035166101757541906662231426543401227031943677210496271413315666998137019531327710927452498791884683076641732867125523485572468192826347298553002492856098559945456717835428919884632088560552947701608026232500274931410062191656012634618490561382586332373881486042294678081760356120460413654607537250261465213988475618052141475317906501667493370778515190710114131786205123577672197812841077971003211666692304805958105838504469844021585579629249154381397171975746463103224232146885894140581242340251584978373540740168832972107564400459966740695091872656200858816526404731740877428939727738341216768904091135367305382289587709978275528583557088360563735330556197803915452119357087224738763999751468082598564168788503070594646216726215897481965551158966348402385308956465955291699224548110979393483498315356836147936937486180761304714081248971254544702900548349117306828094249668718832490797626743054543822077044911958033329898919400844125484032141984001305125243617902513014320244831260322039398329996472465586659972956221724162172271471224883901279850074098683165568681643488482429231137909441867751676876681415152475167272294778576988629542526118786994507182795797630320128820830631863933208551133254939427886794771975285571465917285633577520807624977063764833389536030186027431449424259247458959228770967081013194082595838171626673690126548167515622808858596698698118020626243832938912314826017280588786510639085538785344780414768643059841479549343917882711597103448271404657626379983742056209230422649048202060794392966536249788293042444968983911133434750048824555636937558344227566319
null
384383739557280968493590060685425712130568212507021256812698831320693698154127432950178965822300480631360063401818127604940787020706845681137489279045741628693172499473918618558505320024443157918281146672397534636274404991074772547695457195594117057322708105398032139268617728225275979503879361203205648104837759303679502946084862300053084868079748659078532777315678051703144833824513375148114881620559825494097701319252143252490103969932985545269669434573662480978629279118265587689981110229134483300248063340199569718440497420630690207237883389271945736264370600705796866260413152974868057979263987663323379074786363934006987538771026623702856094741447967737173228645987184733167354317747167366615179095970865101377243643014479773084750911403771487903831532824626382351323621099974382369923206487329492867433640502514489531325415528885648193998327057687724642829413633464763030228411629184550923244515567544058662610793613027278488010000411550301287790089396501601523857314556312504579816916935990769950606026370336168219793055957207244145250798855052362542587557747285478657141206121281698766754128680661759629726292609947988127139767576496871968959199686499489997411973648723349939803224084787857169510448489156294589304778969821508828283369419578728505593759183059169833167058821024275480210376308890138384980680668341446584681511773761281315956413686963710318656030583229629933643285609898040637055700901805003815854320834162147267918813585399247133852609158660045289310093482772053110999121342292388680647309573878676665881488685105004818049899722965953153939147131700388187399673475203892535034773109803965155382554958326782520955894258169481438266562673749160177347638359178016617384824093332544154952026377231911392417760613767438154742979825943771815764774543583365316691199932106457157376833816304147684151495803979443837482796706916938619078199471053004860187540596826202955955963048085395496792454267997886581135316789947974373320004607169805787005081574787962935230202719472265185122333267975636449222778686203253275898538380725072096548691490591861337019926394135309732919911053681446135343008236230206587317160806288954983484175861861044895016180211511561581216340338857983574011732559843089553192114523241613228757891038668534867581257430622456237311112105746214564376432120132340650573497681680549572824825789614070852215407396252643515723649430240136453459972946470601010537550186160547755886074286082358425248194941727451722590433083231861138231
2
null
112638812128517896461866768138475000609150785009888272910026855665633264441450358683722389198299739327513493376863426769643116696736590681477302569140217318966506632724713071385337091254063359134483433319206717654340580612882049354543629476318296503430259111282670552138388003238868752112232210422036273926520364396968933675843496193204082698348344602043772592468308458809631959402245450402002438877073003654743904126553206031473774913112213679883925732582728911417508581026417842867099421395005869375286249233261942340953131987657557074792177343005154872596461521503743330590646650790950398084669383407648015995979591629168502337637898740648973811928576426209900078419182288434833036363178720105659883950932963099262415891078975911847999998036782529379004904936592064265196734035467819261361360676814910410708105682338617234321353815381747976136161193902918949273898634677179573458261779672895159483635206463279807113680034936878463189530237063937162809633850665037957063267993198097633059467264159367195466665758779084823482625259548794524774568441459382183059039638285210546746498170894936561681887814913582333128846676756221941476943738355282857376837908599754670977287919079871627074924072172028934580151189835220361504492681136590221179647179761648022466071118596920819476479983666674250010858206617894632414939272658748577028808163346177824350000495221309025614293281996576777880214508405524545376021417744298833100759926428268729223948725061566882632984829486014276483572427473729018548059291444145008346553625717439701117402670112472736011123057464255916015388859886141902144382372686122844870528496001040215296648669726140802814345588695588226502853138728655247499122467145233101652232401223297214027137855427496801514847468894909088167282211146076579502471414597111889668943921909372322333174192085655305122328061158889223037212908557175404400682141792871946724720987951607125681105004685223261630589816745280192735123902805296250290008507728265366707135214072550744774408429194131875691241731882978959634966518864332078349073688979208781464404759777512273032631362298651825072051578190219719630602830879593572676537207097655814405389355335992996079421085664767322580027900214726186311613079567888381587404618079662096718531598718970730331320693154078390469943161459212852118387479219453822808011770718734047255071190970764905894303438083424162432048406978940575576515122540926114867086891348553101964327966852880154892199983300402332363149706582182690156
null
989000000
null