From 5c7f28b18cb71e71737ec5ee2426ffbb4477fb84 Mon Sep 17 00:00:00 2001 From: Dankrad Feist Date: Tue, 7 Apr 2026 12:33:36 +0300 Subject: [PATCH 1/2] fix: remove redundant to/memo from DecryptionData The `to` and `memo` fields in `DecryptionData` were redundant: the on-chain `ZoneInbox` already decrypts the ciphertext via AES-256-GCM and can derive these values directly from the plaintext. Remove them from the struct and use the decrypted values on-chain instead of comparing against sequencer-supplied duplicates. Saves 52 bytes of calldata per encrypted deposit (20-byte address + 32-byte memo). Closes #357 Made-with: Cursor --- crates/primitives/src/abi.rs | 3 +- crates/tempo-zone/src/builder.rs | 2 - crates/tempo-zone/src/l1.rs | 45 +- crates/tempo-zone/tests/advance_tempo.rs | 2 - .../tests/assets/zone-test-genesis.json | 140 ++++++- docs/pages/protocol/privacy/crypto-review.md | 385 ++++++++++++++++++ docs/pages/protocol/privacy/execution.md | 4 +- docs/pages/protocol/privacy/overview.md | 27 +- docs/pages/protocol/privacy/prover-design.md | 5 +- docs/specs/src/zone/IZone.sol | 4 +- docs/specs/src/zone/ZoneInbox.sol | 23 +- docs/specs/test/zone/ZoneBridge.t.sol | 35 +- docs/specs/test/zone/ZoneInbox.t.sol | 24 +- 13 files changed, 577 insertions(+), 122 deletions(-) create mode 100644 docs/pages/protocol/privacy/crypto-review.md diff --git a/crates/primitives/src/abi.rs b/crates/primitives/src/abi.rs index 78877b802..a54c6e624 100644 --- a/crates/primitives/src/abi.rs +++ b/crates/primitives/src/abi.rs @@ -378,12 +378,11 @@ macro_rules! define_abi { } /// Decryption data provided by the sequencer for encrypted deposits. + /// The decrypted (to, memo) are derived on-chain from the AES-GCM decryption. #[derive(Debug)] struct DecryptionData { bytes32 sharedSecret; uint8 sharedSecretYParity; - address to; - bytes32 memo; ChaumPedersenProof cpProof; } diff --git a/crates/tempo-zone/src/builder.rs b/crates/tempo-zone/src/builder.rs index b168c03c4..1afc97b98 100644 --- a/crates/tempo-zone/src/builder.rs +++ b/crates/tempo-zone/src/builder.rs @@ -690,8 +690,6 @@ mod tests { decryptions: vec![abi::DecryptionData { sharedSecret: B256::ZERO, sharedSecretYParity: 0x02, - to: sender, - memo: B256::ZERO, cpProof: abi::ChaumPedersenProof { s: B256::ZERO, c: B256::ZERO, diff --git a/crates/tempo-zone/src/l1.rs b/crates/tempo-zone/src/l1.rs index 258569a88..bcf3e29ea 100644 --- a/crates/tempo-zone/src/l1.rs +++ b/crates/tempo-zone/src/l1.rs @@ -1124,7 +1124,7 @@ impl L1BlockDeposits { self, sequencer_key: &k256::SecretKey, portal_address: Address, - policy_provider: &crate::l1_state::PolicyProvider, + _policy_provider: &crate::l1_state::PolicyProvider, ) -> eyre::Result { use crate::precompiles::ecies; @@ -1190,46 +1190,15 @@ impl L1BlockDeposits { recipient = %dec.to, token = %d.token, amount = %d.amount, - "Decrypted encrypted deposit, checking policy" + "Decrypted encrypted deposit" ); - // Check TIP-403 policy via the provider (cache-first, RPC fallback). - // Errors are propagated so the engine retries rather than allowing - // unauthorized deposits through. - let authorized = policy_provider - .is_authorized_async( - d.token, - dec.to, - l1_block_number, - crate::l1_state::AuthRole::MintRecipient, - ) - .await?; - - let recipient = if authorized { - debug!( - target: "zone::engine", - recipient = %dec.to, - token = %d.token, - "Policy authorized encrypted deposit recipient" - ); - dec.to - } else { - warn!( - target: "zone::engine", - sender = %d.sender, - recipient = %dec.to, - token = %d.token, - amount = %d.amount, - "Encrypted deposit recipient unauthorized, redirecting to sender" - ); - d.sender - }; - + // TIP-403 policy enforcement happens on-chain: ZoneInbox + // wraps the mint in try/catch and falls back to crediting + // the depositor if the recipient is unauthorized. let decryption = abi::DecryptionData { sharedSecret: dec.proof.shared_secret, sharedSecretYParity: dec.proof.shared_secret_y_parity, - to: recipient, - memo: dec.memo, cpProof: abi::ChaumPedersenProof { s: dec.proof.cp_proof_s, c: dec.proof.cp_proof_c, @@ -1257,8 +1226,6 @@ impl L1BlockDeposits { let decryption = abi::DecryptionData { sharedSecret: proof.shared_secret, sharedSecretYParity: proof.shared_secret_y_parity, - to: d.sender, - memo: B256::ZERO, cpProof: abi::ChaumPedersenProof { s: proof.cp_proof_s, c: proof.cp_proof_c, @@ -1278,8 +1245,6 @@ impl L1BlockDeposits { let decryption = abi::DecryptionData { sharedSecret: B256::ZERO, sharedSecretYParity: 0x02, - to: d.sender, - memo: B256::ZERO, cpProof: abi::ChaumPedersenProof { s: B256::ZERO, c: B256::ZERO, diff --git a/crates/tempo-zone/tests/advance_tempo.rs b/crates/tempo-zone/tests/advance_tempo.rs index 1a305571a..90fb44115 100644 --- a/crates/tempo-zone/tests/advance_tempo.rs +++ b/crates/tempo-zone/tests/advance_tempo.rs @@ -38,8 +38,6 @@ sol! { struct DecryptionData { bytes32 sharedSecret; uint8 sharedSecretYParity; - address to; - bytes32 memo; ChaumPedersenProof cpProof; } } diff --git a/crates/tempo-zone/tests/assets/zone-test-genesis.json b/crates/tempo-zone/tests/assets/zone-test-genesis.json index 160e1313d..8ee48922f 100644 --- a/crates/tempo-zone/tests/assets/zone-test-genesis.json +++ b/crates/tempo-zone/tests/assets/zone-test-genesis.json @@ -1 +1,139 @@ -{"config":{"chainId":1337,"homesteadBlock":0,"daoForkSupport":false,"eip150Block":0,"eip155Block":0,"eip158Block":0,"byzantiumBlock":0,"constantinopleBlock":0,"petersburgBlock":0,"istanbulBlock":0,"berlinBlock":0,"londonBlock":0,"mergeNetsplitBlock":0,"shanghaiTime":0,"cancunTime":0,"pragueTime":0,"osakaTime":0,"terminalTotalDifficulty":0,"terminalTotalDifficultyPassed":true,"depositContractAddress":"0x0000000000000000000000000000000000000000"},"nonce":"0x42","timestamp":"0x0","extraData":"0x74656d706f2d7a6f6e652d67656e65736973","gasLimit":"0x1c9c380","difficulty":"0x0","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","coinbase":"0x0000000000000000000000000000000000000000","alloc":{"0x0000000000000000000000000000000000000000":{"nonce":"0x1","balance":"0x0"},"0x000000000022d473030f116ddee9f6b43ac78ba3":{"nonce":"0x1","balance":"0x0","code":"0x6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000053903611b69577f1f520b5ee38ad937955892c3dfc7055e8eeb515d905781b6951e4c687917c53090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a"},"0x1c00000000000000000000000000000000000000":{"nonce":"0x1","balance":"0x0","code":"0x60806040526004361015610011575f80fd5b5f3560e01c80631d04645f146101245780632245d0831461011f5780632e224dee1461011a5780633d7a27611461011557806346903867146101105780634732f8bb1461010b57806352d922a51461010657806358c3659914610101578063615cf854146100fc5780636aba6931146100f757806380a4cbc8146100f257806381e3da6b146100ed5780639a7361eb146100e8578063c334cd20146100e3578063f3b52855146100de578063f495be0b146100d95763fe770099146100d4575f80fd5b61052e565b610505565b6104dc565b6104bf565b6104a2565b610345565b610329565b6102b1565b61023a565b610214565b6101f7565b6101d1565b6101b1565b610194565b610177565b61014e565b3461014a575f36600319011261014a5760206001600160401b0360075416604051908152f35b5f80fd5b3461014a575f36600319011261014a5760206001600160401b0360015460401c16604051908152f35b3461014a575f36600319011261014a576020600454604051908152f35b3461014a575f36600319011261014a576020600954604051908152f35b3461014a575f36600319011261014a57602060075460c01c604051908152f35b3461014a575f36600319011261014a5760206001600160401b0360085416604051908152f35b3461014a575f36600319011261014a576020600254604051908152f35b3461014a575f36600319011261014a5760206001600160401b0360015416604051908152f35b3461014a575f36600319011261014a576003546040516001600160a01b039091168152602090f35b600435906001600160a01b038216820361014a57565b60206040818301928281528451809452019201905f5b81811061029b5750505090565b825184526020938401939092019160010161028e565b3461014a57604036600319011261014a576102ca610262565b6024356001600160401b03811161014a573660238201121561014a5780600401356001600160401b03811161014a573660248260051b8401011161014a57610325926024610319930190610655565b60405191829182610278565b0390f35b3461014a575f36600319011261014a5760205f54604051908152f35b3461014a57604036600319011261014a5761035e610262565b3360016007609a1b01141580610491575b80610480575b61041557600754604051631e7d027560e31b81526001600160a01b03909216600483015260248035908301526001600160401b0316604482015260208160648160046007609a1b015afa801561041057610325915f916103e1575b506040519081529081906020820190565b610403915060203d602011610409575b6103fb8183610742565b8101906107f6565b5f6103d0565b503d6103f1565b6107eb565b60405162461bcd60e51b815260206004820152603b60248201527f54656d706f53746174653a206f6e6c79207a6f6e652073797374656d20636f6e60448201527f7472616374732063616e20726561642054656d706f20737461746500000000006064820152608490fd5b503360036007609a1b011415610375565b503360026007609a1b01141561036f565b3461014a575f36600319011261014a576020600554604051908152f35b3461014a575f36600319011261014a576020600654604051908152f35b3461014a575f36600319011261014a5760206001600160401b0360075460401c16604051908152f35b3461014a575f36600319011261014a5760206001600160401b0360075460801c16604051908152f35b3461014a57602036600319011261014a576004356001600160401b03811161014a573660238201121561014a578060040135906001600160401b03821161014a57366024838301011161014a576007609a1b193301610646576105b26105ad5f54926105a26007546001600160401b031690565b946024369201610805565b6108c6565b60025403610637576001600160401b036105ec6105e06105da6007546001600160401b031690565b9361085e565b6001600160401b031690565b9116908103610628575f546004546040519081527fdd85219569c3c880f014955916f426d1ca039714b59ce33e24f151f155ac26b990602090a3005b631391e11b60e21b5f5260045ffd5b63591c836760e01b5f5260045ffd5b6303300c7360e31b5f5260045ffd5b91903360016007609a1b0114158061071d575b8061070c575b61041557600754604051632593f8c960e01b81526001600160a01b03909416600485015260606024850152606484018390526001600160401b03166001600160fb1b03831161014a578380926084925f9560051b8092858501376044830152810103018160046007609a1b015afa908115610410575f916106ed575090565b61070991503d805f833e6107018183610742565b810190610768565b90565b503360036007609a1b01141561066e565b503360026007609a1b011415610668565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761076357604052565b61072e565b60208183031261014a578051906001600160401b03821161014a57019080601f8301121561014a578151916001600160401b038311610763578260051b90604051936107b76020840186610742565b845260208085019282010192831161014a57602001905b8282106107db5750505090565b81518152602091820191016107ce565b6040513d5f823e3d90fd5b9081602091031261014a575190565b9291926001600160401b038211610763576040519161082e601f8201601f191660200184610742565b82948184528183011161014a578281602093845f960137010152565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b036001911601906001600160401b03821161087c57565b61084a565b906001820180921161087c57565b600101908160011161087c57565b906021820180921161087c57565b906015820180921161087c57565b9190820180921161087c57565b805160208201205f556108d881610c28565b80915015610ba85761098b61095a61091c836109166108fa6109939688610dd1565b6001600160401b03166001600160401b03196001541617600155565b85610ea6565b905061095461092b8287610dd1565b67ffffffffffffffff60401b6001549160401b169067ffffffffffffffff60401b191617600155565b84610ea6565b90506109856109698286610dd1565b6001600160401b03166001600160401b03196008541617600855565b83610ea6565b905082610d0e565b91908215610ba857610b77610b6f610b5b610b53610b1f610add610aa5610a74610a6c610a648b610a5e610a598f610a3c610a286109f16109e9846109e36109de610a50978b611020565b600255565b88610ea6565b905087610ea6565b9050610a22610a0082896110f0565b60018060a01b03166bffffffffffffffffffffffff60a01b6003541617600355565b86610ea6565b9050610916610a378288611020565b600455565b9050610954610a4b8287611020565b600555565b93849150611020565b600655565b8c610ea6565b90508b610ea6565b90508a610ea6565b9050610a9f610a83828c610dd1565b6001600160401b03166001600160401b03196007541617600755565b89610ea6565b90506109e3610ab4828b610dd1565b67ffffffffffffffff60401b6007549160401b169067ffffffffffffffff60401b191617600755565b9050610b19610aec828a610dd1565b6007805467ffffffffffffffff60801b191660809290921b67ffffffffffffffff60801b16919091179055565b87610ea6565b9050610a22610b2e8289610dd1565b600780546001600160c01b031660c09290921b6001600160c01b031916919091179055565b905085610ea6565b9050610954610b6a8287611020565b600955565b905083610ea6565b9050905b610b8581856108b9565b821015610ba257610b99610b859284610ea6565b90509150610b7b565b50505050565b6305787a5560e41b5f5260045ffd5b908151811015610bc8570160200190565b634e487b7160e01b5f52603260045260245ffd5b60ff60f6199116019060ff821161087c57565b60ff60bf199116019060ff821161087c57565b60ff607f199116019060ff821161087c57565b60ff60b6199116019060ff821161087c57565b805115610d0757610c53610c4d610c3f5f84610bb7565b516001600160f81b03191690565b60f81c90565b9060ff821660bf8111610c69575050505f905f90565b60f710610c8d5750610c7d610c8391610bef565b60ff1690565b906107095f610881565b9190610c7d610c9b91610bdc565b610cad81610ca85f610881565b6108b9565b835110610cff575f925f905b828210610ccf57505061070990610ca85f610881565b909360019060081b610cf6610c7d610c4d610c3f610cf08a610ca85f610881565b87610bb7565b17940190610cb9565b505f91508190565b505f905f90565b9190918051831015610cff57610d2a610c4d610c3f8584610bb7565b9060ff821660bf8111610d425750505090505f905f90565b60f710610d5f5750610d59610c7d61070992610bef565b92610881565b9290610c7d610d6d91610bdc565b90610d7b82610ca883610881565b845110610dc7575f935f905b838210610d9d57505090610ca861070992610881565b909460019060081b610dbe610c7d610c4d610c3f610cf08b610ca88a610881565b17950190610d87565b505090505f905f90565b8051821015610ba857610dea610c4d610c3f8484610bb7565b60ff81169290607f8411610dfe5750505090565b90919392608081145f14610e1457505f93505050565b60818110159081610e9a575b5015610ba857610c7d610e3291610c02565b90610e4082610ca883610881565b845110610ba85792905f935f925b828410610e5b5750505050565b90919294610e7660019167ffffffffffffff009060081b1690565b610e8f610c7d610c4d610c3f610cf08b610ca88a610881565b179501929190610e4e565b6088915011155f610e20565b9190918051831015610ba857610ec2610c4d610c3f8584610bb7565b9060ff8216607f8111610ee15750505090610edc90610881565b600191565b60b78111610f0c575050610efa610c7d61070992610c02565b610ca8610f068261088f565b94610881565b60bf8111610f78575090610c7d610f2291610c15565b5f915f905b828210610f4e57505090610ca882610ca8610f4884610ca86107099761088f565b96610881565b909260019060081b610f6f610c7d610c4d610c3f610cf089610ca88d610881565b17930190610f27565b60f710610f8f5750610efa610c7d61070992610bef565b90610c7d610f9c91610bdc565b5f915f905b828210610fc257505090610ca882610ca8610f4884610ca86107099761088f565b909260019060081b610fe3610c7d610c4d610c3f610cf089610ca88d610881565b17930190610fa1565b602003906020821161087c57565b5f1981019190821161087c57565b600381901b91906001600160fd1b0381160361087c57565b908151811015610ba85761103a610c4d610c3f8385610bb7565b60ff81169060a082036110615750506110528161089d565b825110610ba857016021015190565b909290607f84116110725750505090565b909192608081101590816110e4575b5015610ba857610c7d61109391610c02565b91826110a0575050505f90565b60208311610ba8576110b583610ca883610881565b825110610ba8576110d96110d460216001936110df9501015194610fec565b611008565b1b610ffa565b191690565b60b7915011155f611081565b908151811015610ba85760ff61110c610c4d610c3f8486610bb7565b1660948103611131575061111f816108ab565b825110610ba857016021015160601c90565b608014159150610ba89050575f9056fea2646970667358221220edf4c2545437da93d3b806c70cbb2dec6940eaf8cf99e5dbda66a3e0192368b064736f6c63430008210033","storage":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0xb049644b1d5a0ec9d785dd48f95099e0f566112084acb1ba0814112209b432a1","0x0000000000000000000000000000000000000000000000000000000000000001":"0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000002":"0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000003":"0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","0x0000000000000000000000000000000000000000000000000000000000000005":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","0x0000000000000000000000000000000000000000000000000000000000000006":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","0x0000000000000000000000000000000000000000000000000000000000000007":"0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000008":"0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000009":"0x0000000000000000000000000000000000000000000000000000000000000000"}},"0x1c00000000000000000000000000000000000001":{"nonce":"0x1","balance":"0x0","code":"0x60806040526004361015610011575f80fd5b5f3560e01c80631fbb25ad1461008457806379502c551461007f57806382648c3b1461007a578063a21de6d914610075578063ced9ef9914610070578063d01e8d311461006b5763f3051c0c14610066575f80fd5b6103a1565b6102e1565b61017a565b610136565b61011a565b6100d6565b346100c8575f3660031901126100c8577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03166080908152602090f35b5f80fd5b5f9103126100c857565b346100c8575f3660031901126100c8576040517f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03168152602090f35b346100c8575f3660031901126100c85760205f54604051908152f35b346100c8575f3660031901126100c8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100c85760203660031901126100c857600435331515806101ed575b6101de576101d9816101c97f56da6c5890b0d58ee4cdad987616c4b1cfef3d3c4b1e4827682219e8065d01a893600155565b6040519081529081906020820190565b0390a1005b63bb62587160e01b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa90811561027c575f9161024d575b506001600160a01b0316331415610197565b61026f915060203d602011610275575b61026781836103f2565b810190610424565b5f61023b565b503d61025d565b61043c565b9181601f840112156100c8578235916001600160401b0383116100c8576020808501948460051b0101116100c857565b9181601f840112156100c8578235916001600160401b0383116100c85760208085019460c085020101116100c857565b346100c85760803660031901126100c8576004356001600160401b0381116100c857366023820112156100c8578060040135906001600160401b0382116100c85736602483830101116100c8576024356001600160401b0381116100c85761034d903690600401610281565b6044929192356001600160401b0381116100c85761036f9036906004016102b1565b91606435946001600160401b0386116100c85761039f966103966024973690600401610281565b97909601610a57565b005b346100c8575f3660031901126100c8576020600154604051908152f35b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b038211176103ed57604052565b6103be565b90601f801991011681019081106001600160401b038211176103ed57604052565b6001600160a01b038116036100c857565b908160209103126100c8575161043981610413565b90565b6040513d5f823e3d90fd5b908060209392818452848401375f828201840152601f01601f1916010190565b916020610439938181520191610447565b634e487b7160e01b5f52603260045260245ffd5b91908110156104ae5760051b81013590607e19813603018212156100c8570190565b610478565b3561043981610413565b903590601e19813603018212156100c857018035906001600160401b0382116100c8576020019181360383136100c857565b95939161051b906105299461043999979360018060a01b03168952608060208a01526080890191610447565b918683036040880152610447565b926060818503910152610447565b91908110156104ae5760051b81013590603e19813603018212156100c8570190565b6002111561056357565b634e487b7160e01b5f52602160045260245ffd5b3560028110156100c85790565b35906001600160801b03821682036100c857565b60ff8116036100c857565b6001600160401b0381116103ed57601f01601f191660200190565b35906001600160a01b0319821682036100c857565b35906001600160801b0319821682036100c857565b6020818303126100c8578035906001600160401b0382116100c857019060a0828203126100c8576040519161061c836103d2565b803561062781610413565b8352602081013561063781610413565b602084015261064860408201610584565b6040840152606081013560608401526080810135906001600160401b0382116100c857019060a0828203126100c85760405191610684836103d2565b80358352602081013561069681610598565b602084015260408101356001600160401b0381116100c85781019082601f830112156100c8578135926106c8846105a3565b906106d660405192836103f2565b848252602085850101116100c8575f6020856107159682608097018386013783010152604085015261070a606082016105be565b6060850152016105d3565b6080820152608082015290565b634e487b7160e01b5f52601160045260245ffd5b5f1981146107445760010190565b610722565b91908110156104ae5760c0020190565b3561043981610598565b519081151582036100c857565b908160209103126100c85761043990610763565b604051906107936040836103f2565b600d82526c65636965732d6165732d6b657960981b6020830152565b91906040838203126100c85782516001600160401b0381116100c857830181601f820112156100c8578051916107e4836105a3565b906107f260405192836103f2565b838252602084840101116100c8575f60208461043995828096018386015e830101529301610763565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b926108759060809360209397969786526bffffffffffffffffffffffff60a01b168386015260a0604086015260a085019061081b565b83810360608501525f815201936001600160801b031916910152565b9060028210156105635752565b92919060806040916108b1866001610891565b6060602087015260018060a01b03815116606087015260018060a01b03602082015116828701526001600160801b03838201511660a0870152606081015160c0870152015160a060e0860152805161010086015260ff60208201511661012086015261092d8282015160a06101408801526101a087019061081b565b60608201516001600160a01b0319166101608701526080909101516001600160801b031916610180860152930152565b908160a09103126100c857608060405191610977836103d2565b803561098281610413565b8352602081013561099281610413565b602084015260408101356109a581610413565b60408401526109b660608201610584565b60608401520135608082015290565b60c09093929193608060e08201956109dd835f610891565b80516001600160a01b039081166020858101919091528201518116604080860191909152820151166060808501919091528101516001600160801b031682840152015160a08201520152565b908160209103126100c8575190565b908160209103126100c857516001600160401b03811681036100c85790565b9591949392969033151580611481575b6101de576001548015159081611477575b50611468577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b031696873b156100c85760405163fe77009960e01b8152915f9183918291610ad1919060048401610467565b0381838b5af1801561027c57611454575b505f9492945b8181106113a8575050505f54925f915f915b878310610c915750505003610c82576040516381e3da6b60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166004808301919091526024820152602081604481865afa801561027c57610c65575b505f819055604051631014997960e31b815291602083600481845afa92831561027c575f93610c30575b50602060049160405192838092631d04645f60e01b82525afa801561027c577f87977a3515c59199065d0e2d7837b95d8fcf5fb072c0321138df0786011e32c4926001600160401b03925f92610bfb575b5060408051968752602087019190915291169390819081015b0390a3565b610bf6919250610c229060203d602011610c29575b610c1a81836103f2565b810190610a38565b9190610bdd565b503d610c10565b6004919350610c56602091823d8411610c5e575b610c4e81836103f2565b810190610a29565b939150610b8c565b503d610c44565b610c7d9060203d602011610c5e57610c4e81836103f2565b610b62565b6361aba18160e11b5f5260045ffd5b909194610c9f868985610537565b610ca881610577565b610cb181610559565b610e6657610cc6816020610cce9301906104bd565b81019061095d565b90604051610cf381610ce5602082019486866109c5565b03601f1981018352826103f2565b5190208151909690610d1b90610d0f906001600160a01b031681565b6001600160a01b031690565b6040830180519091906001600160a01b0316906060850191610d4483516001600160801b031690565b823b156100c8576040516340c10f1960e01b81526001600160a01b039290921660048301526001600160801b03166024820152905f908290604490829084905af1801561027c576001958b927fd5277bc9597c7da3fab9cdbba4de6005f48b9eb7389cf2389c4ea9eea3172c2192610e4c575b506020810151610dd8906001600160a01b031695516001600160a01b031690565b8151610e4090608090610dfd906001600160a01b03165b97516001600160801b031690565b930151604080516001600160a01b0390981688526001600160801b0390941660208801529286019290925260a088901b8890039081169516939081906060820190565b0390a45b019190610afa565b80610e5a5f610e60936103f2565b806100cc565b5f610db7565b610e7a816020610e829399949901906104bd565b8101906105e8565b908585101561139957610e9f610e9786610736565b958785610749565b60608301610ead8151611531565b9160808601926020608086610f338751610ecc85825192015160ff1690565b95833598610edb878601610759565b604051635f8a996960e01b8152600481019490945260ff9889166024850152604484018b905288166064840152608483015290951660a48601529101803560c48501526020013560e484015282908190610104820190565b0381731c000000000000000000000000000000000001005afa90811561027c575f9161136b575b501561135c57518251516040516bffffffffffffffffffffffff197f000000000000000000000000000000000000000000000000000000000000000060601b166020820152603481019290925260548083019190915281525f91610fd29190610fc46074836103f2565b610fcc610784565b906116a2565b915160608101519092906001600160a01b0319169061101f611004608060408701519601516001600160801b03191690565b60405163f4a7eb1360e01b815295869485946004860161083f565b0381731c000000000000000000000000000000000001015afa801561027c575f915f91611338575b508061132d575b156113255761105c9061170e565b9061106c610d0f604085016104b3565b6001600160a01b03909116149081611317575b50975b60405161109881610ce56020820194888661089e565b519020976111d2575081516110b790610d0f906001600160a01b031681565b602083018051909391906001600160a01b03169160408101926110e184516001600160801b031690565b833b156100c8576040516340c10f1960e01b81526001600160a01b039290921660048301526001600160801b03166024820152915f908390604490829084905af190811561027c5761118861117a61116c6001988e967f95705d99ac13cf82894fd274cd871942e6f301c98c186271337e8fedbbb9d7ea966111be575b50516001600160a01b031690565b92516001600160a01b031690565b94516001600160801b031690565b604080516001600160a01b039690961686526001600160801b0391909116602086015260a087901b8790039190911693a3610e44565b80610e5a5f6111cc936103f2565b5f61115e565b82516111e890610d0f906001600160a01b031681565b9060408101916111f7836104b3565b91604086019261120e84516001600160801b031690565b833b156100c8576040516340c10f1960e01b81526001600160a01b039290921660048301526001600160801b03166024820152915f908390604490829084905af190811561027c576001968c937ffc236d1b4402e76c2b0a882db36ad3a6fb0f5b6b7edc8ae317d993f10434c43693611303575b506112fb60606112b8610def6112aa6112a4602087015160018060a01b031690565b9a6104b3565b94516001600160a01b031690565b604080516001600160a01b0390991689526001600160801b0390911660208901529301359286019290925260a088901b8890039081169516939081906060820190565b0390a4610e44565b80610e5a5f611311936103f2565b5f611282565b90506060820135145f61107f565b505f97611082565b50604081511461104e565b905061135691503d805f833e61134e81836103f2565b8101906107af565b5f611047565b63fb1f4a4960e01b5f5260045ffd5b61138c915060203d8111611392575b61138481836103f2565b810190610770565b5f610f5a565b503d61137a565b6351de8c1f60e01b5f5260045ffd5b6113b681838598969861048c565b906113ee6113c3836104b3565b926113d160208201826104bd565b9490916113e160408201826104bd565b94909160608101906104bd565b9061083f60921b3b156100c8575f9561141c93604051998a9788976374ae5b3760e11b8952600489016104ef565b03818361083f60921b5af191821561027c57600192611440575b5001949294610ae8565b80610e5a5f61144e936103f2565b5f611436565b80610e5a5f611462936103f2565b5f610ae2565b632f31b33b60e01b5f5260045ffd5b905088115f610a78565b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa90811561027c575f916114e1575b506001600160a01b0316331415610a67565b6114fa915060203d6020116102755761026781836103f2565b5f6114cf565b908160011b918083046002149015171561074457565b906001820180921161074457565b9190820180921161074457565b6115629061155c604051602081019061155381610ce584906006602083019252565b51902091611500565b90611524565b906115eb61156f83611516565b6040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000818116600484015260248301969096527f0000000000000000000000001c0000000000000000000000000000000000000016949092909190602090849081906044820190565b0381885afa92831561027c575f9361166f575b50821561135c576040516381e3da6b60e01b81526001600160a01b03929092166004830152602482015292602090849060449082905afa92831561027c575f9361164b575b509160ff1690565b60ff9193506116689060203d602011610c5e57610c4e81836103f2565b9290611643565b61168991935060203d602011610c5e57610c4e81836103f2565b915f6115fe565b805191908290602001825e015f815290565b916116f660016116d0610439956116e195604051916020830152602082526116cb6040836103f2565b611757565b926040519485916020830190611690565b8260f81b815203601e198101855201836103f2565b604051906020820152602081526116cb6040826103f2565b9081516040810361172a57506034602083015160601c92015190565b633fbbeba160e21b5f52600452604060245260445ffd5b6104399392604092825260208201520190611690565b5f908051604081115f1461186357505f61177960209260405191828092611690565b039060025afa1561027c5760205f6117f4610ce56117e88351965b6040519283917f363636363636363636363636363636363636363636363636363636363636363689187f36363636363636363636363636363636363636363636363636363636363636368b18898501611741565b60405191828092611690565b039060025afa1561027c576118537f5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c6117e85f93610ce56020968651908560405196879518911889850191606093918352602083015260408201520190565b039060025afa1561027c575f5190565b60208083015194908211935091600184146118d257505f925b602082106118bc575b60408210166118a2575b505f6117f4610ce56117e8602094611794565b600160409190910360031b1b5f190119909116905f61188f565b935f1960018360200360031b1b01191693611885565b604001519261187c56fea26469706673582212208d8a42523ffb186688985d2f73794a8e068b9808cc21763bbbe8f12397b181cd64736f6c63430008210033"},"0x1c00000000000000000000000000000000000002":{"nonce":"0x1","balance":"0x0","code":"0x6080806040526004361015610012575f80fd5b5f3560e01c9081632c37826e14610776575080633406527214610751578063378fa8fa1461073657806343c3cb831461071b57806344ee09321461069157806348aa41081461063757806353a8d7391461061b578063545525f1146105fe57806379502c55146105ba57806379fa3289146104ae5780637b9c9aa41461046e578063a94cd931146103eb578063b3b200aa14610347578063b79a6c0c1461024c578063bba9282e14610224578063c9b6ca9b14610208578063ce7025e914610135578063d93af1d2146101135763f490ca96146100ed575f80fd5b3461010f575f36600319011261010f576020604051670de0b6b3a76400008152f35b5f80fd5b3461010f575f36600319011261010f57602061012d610990565b604051908152f35b3461010f57606036600319011261010f5761014e610792565b604435906001600160401b03821161010f573660238301121561010f578160040135916001600160401b03831161010f5760248360051b82010136811161010f57610198846108d0565b936101a660405195866108af565b84526024820191602085015b8284106101c857602061012d8787600435610b47565b83356001600160401b03811161010f5782013660438201121561010f576020916101fd8392369060446024820135910161094b565b8152019301926101b2565b3461010f575f36600319011261010f57602060405161c3508152f35b3461010f575f36600319011261010f5760206001600160401b035f5460801c16604051908152f35b3461010f57602036600319011261010f57600435331515806102ad575b61029e576020817f4f0c4dec68e1e774843a5fc3a522ab2a832ecfc975b9ad8a5033736d9e47f09d92600555604051908152a1005b63bb62587160e01b5f5260045ffd5b50604051630b83774760e31b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561033c575f9161030d575b506001600160a01b0316331415610269565b61032f915060203d602011610335575b61032781836108af565b8101906108e7565b826102fb565b503d61031d565b6040513d5f823e3d90fd5b3461010f5761010036600319011261010f576103616107d4565b6103696107ea565b6103716107be565b6103796107a8565b610381610800565b9060c4356001600160401b03811161010f576103a1903690600401610816565b95909360e4356001600160401b03811161010f576103e9976103d76103cd6103df933690600401610816565b989092369161094b565b96369161094b565b95606435926111e6565b005b3461010f5760e036600319011261010f576104046107d4565b61040c6107ea565b6104146107be565b61041c6107a8565b610424610800565b9060c435946001600160401b03861161010f5761045261044b6103e9973690600401610816565b369161094b565b93604051956104626020886108af565b5f8752606435926111e6565b3461010f57602036600319011261010f576004356001600160401b038116810361010f5761049d602091610906565b6001600160801b0360405191168152f35b3461010f57602036600319011261010f576004356001600160801b03811680910361010f573315158061053b575b61029e57670de0b6b3a7640000811161052c576020817f6f864cce5237e12ffc9a99fc6c59af17222c2bbb3457690cc8753ab16b5d715e926001600160801b03195f5416175f55604051908152a1005b630d62f21160e11b5f5260045ffd5b50604051630b83774760e31b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561033c575f9161059b575b506001600160a01b03163314156104dc565b6105b4915060203d6020116103355761032781836108af565b82610589565b3461010f575f36600319011261010f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461010f575f36600319011261010f576020600554604051908152f35b3461010f575f36600319011261010f5760206040516104008152f35b3461010f575f36600319011261010f575f602060405161065681610864565b82815201526040805161066881610864565b6001600160401b0360015491828152602082600254169101908152835192835251166020820152f35b3461010f57604036600319011261010f5760206004356106af610792565b816106bf60035460045490610843565b809111610713575b506106d1826108d0565b906106df60405192836108af565b828252601f196106ee846108d0565b01925f5b848110610704575061012d9350610b47565b606084820187015285016106f2565b9150836106c7565b3461010f575f36600319011261010f57602060405160718152f35b3461010f575f36600319011261010f57602060405160218152f35b3461010f575f36600319011261010f5760206001600160801b035f5416604051908152f35b3461010f575f36600319011261010f576020905f5460c01c8152f35b602435906001600160401b038216820361010f57565b608435906001600160401b038216820361010f57565b604435906001600160801b038216820361010f57565b600435906001600160a01b038216820361010f57565b602435906001600160a01b038216820361010f57565b60a435906001600160a01b038216820361010f57565b9181601f8401121561010f578235916001600160401b03831161010f576020838186019501011161010f57565b9190820391821161085057565b634e487b7160e01b5f52601160045260245ffd5b604081019081106001600160401b0382111761087f57604052565b634e487b7160e01b5f52604160045260245ffd5b61016081019081106001600160401b0382111761087f57604052565b90601f801991011681019081106001600160401b0382111761087f57604052565b6001600160401b03811161087f5760051b60200190565b9081602091031261010f57516001600160a01b038116810361010f5790565b6001600160401b031661c350016001600160401b038111610850576001600160401b036001600160801b035f54169116026001600160801b0381169081036108505790565b9291926001600160401b03821161087f5760405191610974601f8201601f1916602001846108af565b82948184528183011161010f578281602093845f960137010152565b60045460035490818110156109ab576109a891610843565b90565b50505f90565b6003548110156109cd5760035f52600960205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b90600182811c92168015610a0f575b60208310146109fb57565b634e487b7160e01b5f52602260045260245ffd5b91607f16916109f0565b9060405191825f825492610a2c846109e1565b8084529360018116908115610a975750600114610a53575b50610a51925003836108af565b565b90505f9291925260205f20905f915b818310610a7b575050906020610a51928201015f610a44565b6020919350806001915483858901015201910190918492610a62565b905060209250610a5194915060ff191682840152151560051b8201015f610a44565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b5f5b828110610aeb57505050565b5f82820155600101610adf565b610b0281546109e1565b9081610b0c575050565b81601f5f9311600114610b1d575055565b81835260208320610b3a91601f0160051c84190190600101610add565b8082528160208120915555565b9092915f9333151580611167575b61029e576001600160401b0380431691160361115857600354610b7b6004548092610843565b808411611150575b508151838103611139575082610c2a575b5050505f5460018160c01c01906001600160401b038211610850576001600160c01b031660c091821b6001600160c01b031916175f81905560405184927fec4aff46c65f485f4b15e3c2edadda1d57d002995f5aa262a27c76b9a680ec1692602092911c9081908390610c0681610864565b868152015283600155806001600160401b03196002541617600255604051908152a2565b5f1994509182019190828211610850579082915b818311610df65750505080600455600354809114610c5e575b8080610b94565b5f60035580610c73575b505f6004555f610c57565b806009029060098204036108505760035f525f5b818110610c945750610c68565b6009905f817fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01555f7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c8201555f7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d8201555f7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e8201555f7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f8201555f7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f8608201555f7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f861820155610dc57fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f8628201610af8565b610df07fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f8638201610af8565b01610c87565b9091945f19860195861161085057610e0d866109b1565b5060405190610e1b82610893565b60018060a01b03815416825260018060a01b036001820154169260208301938452886002830154936040810194855260018060a01b0360038501541693606082019485526004810154918960808201976001600160801b038516895260a083019460801c855260058401549060c08401918252600685015493610eea60e08201946001600160401b038716865261010083019660018060a01b039060401c168752610edc6008610ecd60078b01610a19565b9961012086019a8b5201610a19565b9961014084019a8b52610843565b8d518110156109cd5760051b8d0160200151975151611132575f5b885181810361111d5750506001600160801b036001600160401b0392819260018060a01b039051169d5190516040519060208201926bffffffffffffffffffffffff199060601b168352603482015260348152610f636054826108af565b5190209a60018060a01b039051169b511696511691519251169260018060a01b039051169351946040519a6101408c018c81106001600160401b0382111761087f576040528b5260208b0198895260408b01998a5260608b0190815260808b0191825260a08b0192835260c08b0193845260e08b019485526101008b019586526101208b01968752604051998a9960208b019c60408e52600160a01b6001900390511660608c01525160808b0152600160a01b6001900390511660a08a0152516001600160801b031660c0890152516001600160801b031660e088015251610100870152516001600160401b0316610120860152600160a01b6001900390511661014085015251610160840161014090526101a0840161108291610ab9565b9051838203605f190161018085015261109b9190610ab9565b90604083015203601f19810182526110b390826108af565b519020946110c0816109b1565b61110a576008815f61110393555f60018201555f60028201555f60038201555f60048201555f60058201555f60068201556110fd60078201610af8565b01610af8565b9190610c3e565b634e487b7160e01b5f525f60045260245ffd5b63521a2d4d60e11b5f5260045260245260445ffd5b6071610f05565b8390630db2128560e11b5f5260045260245260445ffd5b92505f610b83565b631391e11b60e21b5f5260045ffd5b50604051630b83774760e31b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561033c575f916111c7575b506001600160a01b0316331415610b55565b6111e0915060203d6020116103355761032781836108af565b5f6111b5565b5f969195909491936001600160a01b0390911692831561189c5761040085511161188d57611213896118ab565b60055480611848575b506001600160801b038061122f85610906565b92169116908181016001600160801b0381116108505760405163868a2e9d60e01b8152946020866004815f60056007609a1b015af195861561033c575f96611814575b508515611805576040516323b872dd60e01b81523360048201523060248201526001600160801b0392909216604483018190526001600160a01b0390991698916020816064815f8e5af190811561033c575f916117ca575b50156117bb57883b1561010f5760405191630852cd8d60e31b835260048301525f82602481838d5af191821561033c578c926117a4575b50876040519161131083610893565b8a8352886020840198338a5260408501908152606085019d60018060a01b03169d8e8152608086019088825260a08701908a825260c08801938c85526001600160401b0360e08a0197169d8e88526101008a019687526101208a019889526101408a019a8b526003546801000000000000000081101561178a5780600161139a92016003556109b1565b9a909a61177157518a546001600160a01b03199081166001600160a01b03928316178c55915160018c0180548416918316919091179055915160028b0155915160038a01805490931691161790559051905160801b6fffffffffffffffffffffffffffffffff19166001600160801b0391909116176004860155516005850155905160068401805492516001600160e01b03199093166001600160401b039283161760409390931b68010000000000000000600160e01b031692909217909155905180516007840192909190821161175d578d9061147884546109e1565b601f811161171a575b50602091601f84116001146116b45760089594936114b5939092836115e7575b50508160011b915f199060031b1c19161790565b90555b01905180516001600160401b0381116116a0578b6114d684546109e1565b601f8111611654575b505060208c601f83116001146115f2579061150d93836115e75750508160011b915f199060031b1c19161790565b90555b8854986001600160401b038a60801c16996001600160401b038b146115d357926115be95927f348c28d1410ff29393c038fe0f1998384082e98e315624b24c04a4fa6288b9de9a999895926115ce98958d60016001600160401b0360801b910160801b16906001600160401b0360801b1916179055604051998a998a5260208a015260408901526060880152608087015260a086015260c085015261012060e0850152610120840190610ab9565b8281036101008401523396610ab9565b0390a3565b634e487b7160e01b82526011600452602482fd5b015190505f806114a1565b9192601f198416858452828420935b81811061163c5750908460019594939210611624575b505050811b019055611510565b01515f1960f88460031b161c191690555f8080611617565b92936020600181928786015181550195019301611601565b84838211611663575b506114df565b61169092528d6020812091601f850160051c9160208610611698575b50601f82910160051c039101610add565b8b5f8461165d565b91508f61167f565b634e487b7160e01b8c52604160045260248cfd5b9190601f198416858452828420935b8181106117025750916001939185600898979694106116ea575b505050811b0190556114b8565b01515f1960f88460031b161c191690555f80806116dd565b929360206001819287860151815501950193016116c3565b838111156114815761174f908584526020842090601f860160051c9060208710611755575b601f82910160051c039101610add565b5f611481565b85915061173f565b634e487b7160e01b8e52604160045260248efd5b50505050505060248f634e487b7160e01b815280600452fd5b50505050505060248f634e487b7160e01b81526041600452fd5b5f919b506117b292506108af565b895f995f611301565b6312171d8360e31b5f5260045ffd5b90506020813d6020116117fd575b816117e5602093836108af565b8101031261010f5751801515810361010f575f6112ca565b3d91506117d8565b632968ee7f60e21b5f5260045ffd5b9095506020813d602011611840575b81611830602093836108af565b8101031261010f5751945f611272565b3d9150611823565b6007544303611880575b60065490811015611871575f198114610850576001016006555f61121c565b63124ab48560e11b5f5260045ffd5b436007555f600655611852565b634b8a874d60e11b5f5260045ffd5b63c29f0c7160e01b5f5260045ffd5b80518015611903576021036118e5578051156109cd57602001516001600160f81b031916600160f91b81141590816118f4575b506118e557565b6361d0136b60e11b5f5260045ffd5b600360f81b141590505f6118de565b505056fea2646970667358221220652e7449c8658b6fc3b3333b742e8b3959d13566217fc352249d4a8ad22860c164736f6c63430008220033"},"0x1c00000000000000000000000000000000000003":{"nonce":"0x1","balance":"0x0","code":"0x6080806040526004361015610012575f80fd5b5f3560e01c9081631beb1ab814610561575080631fbb25ad1461051d5780633488ce0d146102dd5780635c1bba381461023b5780636d46e98714610193578063a21de6d91461014f5763e202d99514610069575f80fd5b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260016024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d575b6040516001600160a01b039091168152602090f35b506020813d60201161013c575b816101276020938361067c565b8101031261013857602090516100f8565b5f80fd5b3d915061011a565b6040513d5f823e3d90fd5b34610138575f366003190112610138576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169081900361013857604051630b83774760e31b8152602081600481305afa908115610144575f916101f6575b506040516001600160a01b039091169091148152602090f35b90506020813d602011610233575b816102116020938361067c565b810103126101385751906001600160a01b0382168203610138579060206101dd565b3d9150610204565b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d576040516001600160a01b039091168152602090f35b34610138575f366003190112610138576040516381e3da6b60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038181166004840152600660248401527f0000000000000000000000001c00000000000000000000000000000000000000169190602082604481865afa918215610144575f926104e9575b5081156104da576040516020810190600682526020815261038f60408261067c565b519020915f1981019081116104c6578060011b90808204600214901517156104c65782018092116104c65760018201908183116104c6576040516381e3da6b60e01b81526001600160a01b03821660048201526024810193909352602083604481875afa928315610144575f9361048e575b506040516381e3da6b60e01b81526001600160a01b03909116600482015260248101919091529160209083908180604481015b03915afa918215610144575f92610459575b5060ff6040928351928352166020820152f35b91506020823d602011610486575b816104746020938361067c565b810103126101385790519060ff610446565b3d9150610467565b919092506020823d6020116104be575b816104ab6020938361067c565b8101031261013857905191610434610401565b3d915061049e565b634e487b7160e01b5f52601160045260245ffd5b630c322fb560e31b5f5260045ffd5b9091506020813d602011610515575b816105056020938361067c565b810103126101385751908361036d565b3d91506104f8565b34610138575f366003190112610138576040517f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169190829003610138576105fe9181602080930191825260076040820152604081526105ab60608261067c565b5190206040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152602481019190915291829081906044820190565b03817f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03165afa8015610144575f90610649575b60209060ff604051911615158152f35b506020813d602011610674575b816106636020938361067c565b810103126101385760209051610639565b3d9150610656565b90601f8019910116810190811067ffffffffffffffff82111761069e57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220615455022182404b5eef598e1c4e66b9fba2ee08aa579832c0c247d1afef17a164736f6c63430008210033"},"0x1c00000000000000000000000000000000000004":{"nonce":"0x1","balance":"0x0","code":"0xfe"},"0x20c0000000000000000000000000000000000000":{"nonce":"0x0","balance":"0x0","code":"0xef","storage":{"0x0000000000000000000000000000000000000000000000000000000000000002":"0x706174685553440000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000003":"0x706174685553440000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000004":"0x5553440000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000006":"0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000007":"0x0000000000000000000000010000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000008":"0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000d":"0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff","0x1a08d1eefb6dea6eba7c6c1f53fa17f31dc24b9efe98e97550f0dad434642618":"0x0000000000000000000000000000000000000000000000000000000000000001","0x353fe882519f79b8caf8d301c26c19d663ae2e691ca2e75dc341b346d5d22c63":"0x0000000000000000000000000000000000000000000000000000000000000001","0x983ee3ed0ac6ffe1e6626c807d5dad57db7645721c041f19b39c3f728acefdd7":"0x0000000000000000000000000000000000000000000000000000000000000001","0x9a3d8dc9bf2bb7465d975ea80af65f820bc69e3b43668ac11765d4e28cf9333a":"0x0000000000000000000000000000000000000000000000000000000000000001","0xad6e221fb67208b50def8b13e82392da7f9eaacd7b17f77c8bfdc7df401bc3d8":"0x0000000000000000000000000000000000000000000000000000000000000000","0xbd1422d956203483f6a77a55f068041e264cef0ec8c355db258a1fb8f4169a51":"0x0000000000000000000000000000000000000000000000000000000000000001","0xc39d774f18115b85b81494d65e588b565d73abc969333d1da7b0a0eb0729accd":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}},"0x20c0000000000000000000000000000000000001":{"nonce":"0x0","balance":"0x0","code":"0xef","storage":{"0x0000000000000000000000000000000000000000000000000000000000000002":"0x416c706861555344000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000003":"0x416c706861555344000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000004":"0x5553440000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000006":"0x00000000000000000000000020c0000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000007":"0x00000000000000000000000120c0000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000008":"0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000d":"0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff","0x1a08d1eefb6dea6eba7c6c1f53fa17f31dc24b9efe98e97550f0dad434642618":"0x0000000000000000000000000000000000000000000000000000000000000001","0x353fe882519f79b8caf8d301c26c19d663ae2e691ca2e75dc341b346d5d22c63":"0x0000000000000000000000000000000000000000000000000000000000000001","0x983ee3ed0ac6ffe1e6626c807d5dad57db7645721c041f19b39c3f728acefdd7":"0x0000000000000000000000000000000000000000000000000000000000000001","0x9a3d8dc9bf2bb7465d975ea80af65f820bc69e3b43668ac11765d4e28cf9333a":"0x0000000000000000000000000000000000000000000000000000000000000001","0xbd1422d956203483f6a77a55f068041e264cef0ec8c355db258a1fb8f4169a51":"0x0000000000000000000000000000000000000000000000000000000000000001","0xc39d774f18115b85b81494d65e588b565d73abc969333d1da7b0a0eb0729accd":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}},"0x20c0000000000000000000000000000000000002":{"nonce":"0x0","balance":"0x0","code":"0xef","storage":{"0x0000000000000000000000000000000000000000000000000000000000000002":"0x426574615553440000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000003":"0x426574615553440000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000004":"0x5553440000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000006":"0x00000000000000000000000020c0000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000007":"0x00000000000000000000000120c0000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000008":"0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000d":"0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff","0x1a08d1eefb6dea6eba7c6c1f53fa17f31dc24b9efe98e97550f0dad434642618":"0x0000000000000000000000000000000000000000000000000000000000000001","0x353fe882519f79b8caf8d301c26c19d663ae2e691ca2e75dc341b346d5d22c63":"0x0000000000000000000000000000000000000000000000000000000000000001","0x983ee3ed0ac6ffe1e6626c807d5dad57db7645721c041f19b39c3f728acefdd7":"0x0000000000000000000000000000000000000000000000000000000000000001","0x9a3d8dc9bf2bb7465d975ea80af65f820bc69e3b43668ac11765d4e28cf9333a":"0x0000000000000000000000000000000000000000000000000000000000000001","0xbd1422d956203483f6a77a55f068041e264cef0ec8c355db258a1fb8f4169a51":"0x0000000000000000000000000000000000000000000000000000000000000001","0xc39d774f18115b85b81494d65e588b565d73abc969333d1da7b0a0eb0729accd":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}},"0x20fc000000000000000000000000000000000000":{"nonce":"0x0","balance":"0x0","code":"0xef"},"0x403c000000000000000000000000000000000000":{"nonce":"0x0","balance":"0x0","code":"0xef"},"0x4e4f4e4345000000000000000000000000000000":{"nonce":"0x0","balance":"0x0","code":"0xef"},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":"0x1","balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"},"0x914d7fec6aac8cd542e72bca78b30650d45643d7":{"nonce":"0x1","balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"},"0xaaaaaaaa00000000000000000000000000000000":{"nonce":"0x0","balance":"0x0","code":"0xef"},"0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed":{"nonce":"0x1","balance":"0x0","code":"0x60806040526004361061018a5760003560e01c806381503da1116100d6578063d323826a1161007f578063e96deee411610059578063e96deee414610395578063f5745aba146103a8578063f9664498146103bb57600080fd5b8063d323826a1461034f578063ddda0acb1461036f578063e437252a1461038257600080fd5b80639c36a286116100b05780639c36a28614610316578063a7db93f214610329578063c3fe107b1461033c57600080fd5b806381503da1146102d0578063890c283b146102e357806398e810771461030357600080fd5b80632f990e3f116101385780636cec2536116101125780636cec25361461027d57806374637a7a1461029d5780637f565360146102bd57600080fd5b80632f990e3f1461023757806331a7c8c81461024a57806342d654fc1461025d57600080fd5b806327fe18221161016957806327fe1822146101f15780632852527a1461020457806328ddd0461461021757600080fd5b8062d84acb1461018f57806326307668146101cb57806326a32fc7146101de575b600080fd5b6101a261019d366004612915565b6103ce565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101a26101d9366004612994565b6103e6565b6101a26101ec3660046129db565b610452565b6101a26101ff3660046129db565b6104de565b6101a2610212366004612a39565b610539565b34801561022357600080fd5b506101a2610232366004612a90565b6106fe565b6101a2610245366004612aa9565b61072a565b6101a2610258366004612aa9565b6107bb565b34801561026957600080fd5b506101a2610278366004612b1e565b6107c9565b34801561028957600080fd5b506101a2610298366004612a90565b610823565b3480156102a957600080fd5b506101a26102b8366004612b4a565b61084f565b6101a26102cb3660046129db565b611162565b6101a26102de366004612b74565b6111e8565b3480156102ef57600080fd5b506101a26102fe366004612bac565b611276565b6101a2610311366004612bce565b6112a3565b6101a2610324366004612994565b611505565b6101a2610337366004612c49565b6116f1565b6101a261034a366004612aa9565b611964565b34801561035b57600080fd5b506101a261036a366004612cd9565b6119ed565b6101a261037d366004612c49565b611a17565b6101a2610390366004612bce565b611e0c565b6101a26103a3366004612915565b611e95565b6101a26103b6366004612bce565b611ea4565b6101a26103c9366004612b74565b611f2d565b60006103dd8585858533611a17565b95945050505050565b6000806103f2846120db565b90508083516020850134f59150610408826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a35092915050565b60006104d86104d260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b836103e6565b92915050565b600081516020830134f090506104f3816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a2919050565b600080610545856120db565b905060008460601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f593505073ffffffffffffffffffffffffffffffffffffffff8316610635576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed1660048201526024015b60405180910390fd5b604051829073ffffffffffffffffffffffffffffffffffffffff8516907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808473ffffffffffffffffffffffffffffffffffffffff1634876040516106a19190612d29565b60006040518083038185875af1925050503d80600081146106de576040519150601f19603f3d011682016040523d82523d6000602084013e6106e3565b606091505b50915091506106f382828961247d565b505050509392505050565b60006104d87f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed8361084f565b60006107b36107aa60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b85858533611a17565b949350505050565b60006107b3848484336112a3565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b60006104d8827f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed6107c9565b600060607f9400000000000000000000000000000000000000000000000000000000000000610887600167ffffffffffffffff612d45565b67ffffffffffffffff16841115610902576040517f3c55ab3b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b836000036109c7576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f800000000000000000000000000000000000000000000000000000000000000060368201526037015b6040516020818303038152906040529150611152565b607f8411610a60576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602283015260f886901b1660368201526037016109b1565b60ff8411610b1f576040517fd70000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660228301527f8100000000000000000000000000000000000000000000000000000000000000603683015260f886901b1660378201526038016109b1565b61ffff8411610bff576040517fd80000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f820000000000000000000000000000000000000000000000000000000000000060368201527fffff00000000000000000000000000000000000000000000000000000000000060f086901b1660378201526039016109b1565b62ffffff8411610ce0576040517fd90000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f830000000000000000000000000000000000000000000000000000000000000060368201527fffffff000000000000000000000000000000000000000000000000000000000060e886901b166037820152603a016109b1565b63ffffffff8411610dc2576040517fda0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f840000000000000000000000000000000000000000000000000000000000000060368201527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b166037820152603b016109b1565b64ffffffffff8411610ea5576040517fdb0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f850000000000000000000000000000000000000000000000000000000000000060368201527fffffffffff00000000000000000000000000000000000000000000000000000060d886901b166037820152603c016109b1565b65ffffffffffff8411610f89576040517fdc0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f860000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffff000000000000000000000000000000000000000000000000000060d086901b166037820152603d016109b1565b66ffffffffffffff841161106e576040517fdd0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f870000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffff0000000000000000000000000000000000000000000000000060c886901b166037820152603e016109b1565b6040517fde0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f880000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b166037820152603f0160405160208183030381529060405291505b5080516020909101209392505050565b60006104d86111e260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b83611505565b600061126f61126860408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b8484610539565b9392505050565b600061126f83837f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed6119ed565b60008451602086018451f090506112b9816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808273ffffffffffffffffffffffffffffffffffffffff168560200151876040516113279190612d29565b60006040518083038185875af1925050503d8060008114611364576040519150601f19603f3d011682016040523d82523d6000602084013e611369565b606091505b5091509150816113c9577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed1631156114fb578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b509092509050816114fb577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b5050949350505050565b600080611511846120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115e0576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a361162c83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1634876040516116569190612d29565b60006040518083038185875af1925050503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b505090506116a681866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a25050505092915050565b6000806116fd876120db565b9050808651602088018651f59150611714826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808373ffffffffffffffffffffffffffffffffffffffff168660200151886040516117849190612d29565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b509150915081611826577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed163115611958578473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b50909250905081611958577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b50505095945050505050565b60006107b36119e460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b858585336116f1565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600080611a23876120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff8116611af2576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a3611b3e83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1687600001518a604051611b6c9190612d29565b60006040518083038185875af1925050503d8060008114611ba9576040519150601f19603f3d011682016040523d82523d6000602084013e611bae565b606091505b50509050611bbc81866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a260608573ffffffffffffffffffffffffffffffffffffffff1688602001518a604051611c299190612d29565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b50909250905081611ccc577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed163115611dfe578673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611d98576040519150601f19603f3d011682016040523d82523d6000602084013e611d9d565b606091505b50909250905081611dfe577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050505095945050505050565b60006103dd611e8c60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b868686866116f1565b60006103dd85858585336116f1565b60006103dd611f2460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b86868686611a17565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f092505073ffffffffffffffffffffffffffffffffffffffff8216612016576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808373ffffffffffffffffffffffffffffffffffffffff1634866040516120809190612d29565b60006040518083038185875af1925050503d80600081146120bd576040519150601f19603f3d011682016040523d82523d6000602084013e6120c2565b606091505b50915091506120d282828861247d565b50505092915050565b60008060006120e9846125b3565b9092509050600082600281111561210257612102612e02565b1480156121205750600081600281111561211e5761211e612e02565b145b1561215e57604080513360208201524691810191909152606081018590526080016040516020818303038152906040528051906020012092506123cc565b600082600281111561217257612172612e02565b1480156121905750600181600281111561218e5761218e612e02565b145b156121b0576121a9338560009182526020526040902090565b92506123cc565b60008260028111156121c4576121c4612e02565b03612233576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b600182600281111561224757612247612e02565b1480156122655750600081600281111561226357612263612e02565b145b1561227e576121a9468560009182526020526040902090565b600182600281111561229257612292612e02565b1480156122b0575060028160028111156122ae576122ae612e02565b145b1561231f576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b61239a60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b84036123a657836123c9565b604080516020810186905201604051602081830303815290604052805190602001205b92505b5050919050565b73ffffffffffffffffffffffffffffffffffffffff8116158061240b575073ffffffffffffffffffffffffffffffffffffffff81163b155b1561247a576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b50565b82158061249f575073ffffffffffffffffffffffffffffffffffffffff81163b155b156124fa577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed826040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050565b811580612520575073ffffffffffffffffffffffffffffffffffffffff8116155b80612540575073ffffffffffffffffffffffffffffffffffffffff81163b155b156125af576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b5050565b600080606083901c3314801561261057508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b1561262057506000905080915091565b606083901c3314801561265a57507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561266b5750600090506001915091565b33606084901c036126825750600090506002915091565b606083901c1580156126db57508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b156126ec5750600190506000915091565b606083901c15801561272557507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561273557506001905080915091565b606083901c61274a5750600190506002915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000036127a55750600290506000915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000036127e15750600290506001915091565b506002905080915091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261282c57600080fd5b813567ffffffffffffffff80821115612847576128476127ec565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561288d5761288d6127ec565b816040528381528660208588010111156128a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000604082840312156128d857600080fd5b6040516040810181811067ffffffffffffffff821117156128fb576128fb6127ec565b604052823581526020928301359281019290925250919050565b60008060008060a0858703121561292b57600080fd5b84359350602085013567ffffffffffffffff8082111561294a57600080fd5b6129568883890161281b565b9450604087013591508082111561296c57600080fd5b506129798782880161281b565b92505061298986606087016128c6565b905092959194509250565b600080604083850312156129a757600080fd5b82359150602083013567ffffffffffffffff8111156129c557600080fd5b6129d18582860161281b565b9150509250929050565b6000602082840312156129ed57600080fd5b813567ffffffffffffffff811115612a0457600080fd5b6107b38482850161281b565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a3457600080fd5b919050565b600080600060608486031215612a4e57600080fd5b83359250612a5e60208501612a10565b9150604084013567ffffffffffffffff811115612a7a57600080fd5b612a868682870161281b565b9150509250925092565b600060208284031215612aa257600080fd5b5035919050565b600080600060808486031215612abe57600080fd5b833567ffffffffffffffff80821115612ad657600080fd5b612ae28783880161281b565b94506020860135915080821115612af857600080fd5b50612b058682870161281b565b925050612b1585604086016128c6565b90509250925092565b60008060408385031215612b3157600080fd5b82359150612b4160208401612a10565b90509250929050565b60008060408385031215612b5d57600080fd5b612b6683612a10565b946020939093013593505050565b60008060408385031215612b8757600080fd5b612b9083612a10565b9150602083013567ffffffffffffffff8111156129c557600080fd5b60008060408385031215612bbf57600080fd5b50508035926020909101359150565b60008060008060a08587031215612be457600080fd5b843567ffffffffffffffff80821115612bfc57600080fd5b612c088883890161281b565b95506020870135915080821115612c1e57600080fd5b50612c2b8782880161281b565b935050612c3b86604087016128c6565b915061298960808601612a10565b600080600080600060c08688031215612c6157600080fd5b85359450602086013567ffffffffffffffff80821115612c8057600080fd5b612c8c89838a0161281b565b95506040880135915080821115612ca257600080fd5b50612caf8882890161281b565b935050612cbf87606088016128c6565b9150612ccd60a08701612a10565b90509295509295909350565b600080600060608486031215612cee57600080fd5b8335925060208401359150612b1560408501612a10565b60005b83811015612d20578181015183820152602001612d08565b50506000910152565b60008251612d3b818460208701612d05565b9190910192915050565b67ffffffffffffffff828116828216039080821115612d8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612dcf816060850160208701612d05565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000817000a"},"0xca11bde05977b3631167028862be2a173976ca11":{"nonce":"0x1","balance":"0x0","code":"0x6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033"},"0xdec0000000000000000000000000000000000000":{"nonce":"0x0","balance":"0x0","code":"0xef"},"0xfeec000000000000000000000000000000000000":{"nonce":"0x0","balance":"0x0","code":"0xef","storage":{"0xabd7b398c2237712843e3e780dcd40dfb99446b30666f04c025da4efa5ce5177":"0x0000000000000000000000000000000000000000000000000000000000000000"}}},"baseFeePerGas":"0x2540be400"} \ No newline at end of file +{ + "config": { + "chainId": 1337, + "homesteadBlock": 0, + "daoForkSupport": false, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "mergeNetsplitBlock": 0, + "shanghaiTime": 0, + "cancunTime": 0, + "pragueTime": 0, + "osakaTime": 0, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true, + "depositContractAddress": "0x0000000000000000000000000000000000000000" + }, + "nonce": "0x42", + "timestamp": "0x0", + "extraData": "0x74656d706f2d7a6f6e652d67656e65736973", + "gasLimit": "0x1c9c380", + "difficulty": "0x0", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0x0000000000000000000000000000000000000000": { + "nonce": "0x1", + "balance": "0x0" + }, + "0x000000000022d473030f116ddee9f6b43ac78ba3": { + "nonce": "0x1", + "balance": "0x0", + "code": "0x6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000053903611b69577f1f520b5ee38ad937955892c3dfc7055e8eeb515d905781b6951e4c687917c53090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a" + }, + "0x1c00000000000000000000000000000000000000": { + "nonce": "0x1", + "balance": "0x0", + "code": "0x60806040526004361015610011575f80fd5b5f3560e01c80631d04645f146101245780632245d0831461011f5780632e224dee1461011a5780633d7a27611461011557806346903867146101105780634732f8bb1461010b57806352d922a51461010657806358c3659914610101578063615cf854146100fc5780636aba6931146100f757806380a4cbc8146100f257806381e3da6b146100ed5780639a7361eb146100e8578063c334cd20146100e3578063f3b52855146100de578063f495be0b146100d95763fe770099146100d4575f80fd5b61052e565b610505565b6104dc565b6104bf565b6104a2565b610345565b610329565b6102b1565b61023a565b610214565b6101f7565b6101d1565b6101b1565b610194565b610177565b61014e565b3461014a575f36600319011261014a5760206001600160401b0360075416604051908152f35b5f80fd5b3461014a575f36600319011261014a5760206001600160401b0360015460401c16604051908152f35b3461014a575f36600319011261014a576020600454604051908152f35b3461014a575f36600319011261014a576020600954604051908152f35b3461014a575f36600319011261014a57602060075460c01c604051908152f35b3461014a575f36600319011261014a5760206001600160401b0360085416604051908152f35b3461014a575f36600319011261014a576020600254604051908152f35b3461014a575f36600319011261014a5760206001600160401b0360015416604051908152f35b3461014a575f36600319011261014a576003546040516001600160a01b039091168152602090f35b600435906001600160a01b038216820361014a57565b60206040818301928281528451809452019201905f5b81811061029b5750505090565b825184526020938401939092019160010161028e565b3461014a57604036600319011261014a576102ca610262565b6024356001600160401b03811161014a573660238201121561014a5780600401356001600160401b03811161014a573660248260051b8401011161014a57610325926024610319930190610655565b60405191829182610278565b0390f35b3461014a575f36600319011261014a5760205f54604051908152f35b3461014a57604036600319011261014a5761035e610262565b3360016007609a1b01141580610491575b80610480575b61041557600754604051631e7d027560e31b81526001600160a01b03909216600483015260248035908301526001600160401b0316604482015260208160648160046007609a1b015afa801561041057610325915f916103e1575b506040519081529081906020820190565b610403915060203d602011610409575b6103fb8183610742565b8101906107f6565b5f6103d0565b503d6103f1565b6107eb565b60405162461bcd60e51b815260206004820152603b60248201527f54656d706f53746174653a206f6e6c79207a6f6e652073797374656d20636f6e60448201527f7472616374732063616e20726561642054656d706f20737461746500000000006064820152608490fd5b503360036007609a1b011415610375565b503360026007609a1b01141561036f565b3461014a575f36600319011261014a576020600554604051908152f35b3461014a575f36600319011261014a576020600654604051908152f35b3461014a575f36600319011261014a5760206001600160401b0360075460401c16604051908152f35b3461014a575f36600319011261014a5760206001600160401b0360075460801c16604051908152f35b3461014a57602036600319011261014a576004356001600160401b03811161014a573660238201121561014a578060040135906001600160401b03821161014a57366024838301011161014a576007609a1b193301610646576105b26105ad5f54926105a26007546001600160401b031690565b946024369201610805565b6108c6565b60025403610637576001600160401b036105ec6105e06105da6007546001600160401b031690565b9361085e565b6001600160401b031690565b9116908103610628575f546004546040519081527fdd85219569c3c880f014955916f426d1ca039714b59ce33e24f151f155ac26b990602090a3005b631391e11b60e21b5f5260045ffd5b63591c836760e01b5f5260045ffd5b6303300c7360e31b5f5260045ffd5b91903360016007609a1b0114158061071d575b8061070c575b61041557600754604051632593f8c960e01b81526001600160a01b03909416600485015260606024850152606484018390526001600160401b03166001600160fb1b03831161014a578380926084925f9560051b8092858501376044830152810103018160046007609a1b015afa908115610410575f916106ed575090565b61070991503d805f833e6107018183610742565b810190610768565b90565b503360036007609a1b01141561066e565b503360026007609a1b011415610668565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761076357604052565b61072e565b60208183031261014a578051906001600160401b03821161014a57019080601f8301121561014a578151916001600160401b038311610763578260051b90604051936107b76020840186610742565b845260208085019282010192831161014a57602001905b8282106107db5750505090565b81518152602091820191016107ce565b6040513d5f823e3d90fd5b9081602091031261014a575190565b9291926001600160401b038211610763576040519161082e601f8201601f191660200184610742565b82948184528183011161014a578281602093845f960137010152565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b036001911601906001600160401b03821161087c57565b61084a565b906001820180921161087c57565b600101908160011161087c57565b906021820180921161087c57565b906015820180921161087c57565b9190820180921161087c57565b805160208201205f556108d881610c28565b80915015610ba85761098b61095a61091c836109166108fa6109939688610dd1565b6001600160401b03166001600160401b03196001541617600155565b85610ea6565b905061095461092b8287610dd1565b67ffffffffffffffff60401b6001549160401b169067ffffffffffffffff60401b191617600155565b84610ea6565b90506109856109698286610dd1565b6001600160401b03166001600160401b03196008541617600855565b83610ea6565b905082610d0e565b91908215610ba857610b77610b6f610b5b610b53610b1f610add610aa5610a74610a6c610a648b610a5e610a598f610a3c610a286109f16109e9846109e36109de610a50978b611020565b600255565b88610ea6565b905087610ea6565b9050610a22610a0082896110f0565b60018060a01b03166bffffffffffffffffffffffff60a01b6003541617600355565b86610ea6565b9050610916610a378288611020565b600455565b9050610954610a4b8287611020565b600555565b93849150611020565b600655565b8c610ea6565b90508b610ea6565b90508a610ea6565b9050610a9f610a83828c610dd1565b6001600160401b03166001600160401b03196007541617600755565b89610ea6565b90506109e3610ab4828b610dd1565b67ffffffffffffffff60401b6007549160401b169067ffffffffffffffff60401b191617600755565b9050610b19610aec828a610dd1565b6007805467ffffffffffffffff60801b191660809290921b67ffffffffffffffff60801b16919091179055565b87610ea6565b9050610a22610b2e8289610dd1565b600780546001600160c01b031660c09290921b6001600160c01b031916919091179055565b905085610ea6565b9050610954610b6a8287611020565b600955565b905083610ea6565b9050905b610b8581856108b9565b821015610ba257610b99610b859284610ea6565b90509150610b7b565b50505050565b6305787a5560e41b5f5260045ffd5b908151811015610bc8570160200190565b634e487b7160e01b5f52603260045260245ffd5b60ff60f6199116019060ff821161087c57565b60ff60bf199116019060ff821161087c57565b60ff607f199116019060ff821161087c57565b60ff60b6199116019060ff821161087c57565b805115610d0757610c53610c4d610c3f5f84610bb7565b516001600160f81b03191690565b60f81c90565b9060ff821660bf8111610c69575050505f905f90565b60f710610c8d5750610c7d610c8391610bef565b60ff1690565b906107095f610881565b9190610c7d610c9b91610bdc565b610cad81610ca85f610881565b6108b9565b835110610cff575f925f905b828210610ccf57505061070990610ca85f610881565b909360019060081b610cf6610c7d610c4d610c3f610cf08a610ca85f610881565b87610bb7565b17940190610cb9565b505f91508190565b505f905f90565b9190918051831015610cff57610d2a610c4d610c3f8584610bb7565b9060ff821660bf8111610d425750505090505f905f90565b60f710610d5f5750610d59610c7d61070992610bef565b92610881565b9290610c7d610d6d91610bdc565b90610d7b82610ca883610881565b845110610dc7575f935f905b838210610d9d57505090610ca861070992610881565b909460019060081b610dbe610c7d610c4d610c3f610cf08b610ca88a610881565b17950190610d87565b505090505f905f90565b8051821015610ba857610dea610c4d610c3f8484610bb7565b60ff81169290607f8411610dfe5750505090565b90919392608081145f14610e1457505f93505050565b60818110159081610e9a575b5015610ba857610c7d610e3291610c02565b90610e4082610ca883610881565b845110610ba85792905f935f925b828410610e5b5750505050565b90919294610e7660019167ffffffffffffff009060081b1690565b610e8f610c7d610c4d610c3f610cf08b610ca88a610881565b179501929190610e4e565b6088915011155f610e20565b9190918051831015610ba857610ec2610c4d610c3f8584610bb7565b9060ff8216607f8111610ee15750505090610edc90610881565b600191565b60b78111610f0c575050610efa610c7d61070992610c02565b610ca8610f068261088f565b94610881565b60bf8111610f78575090610c7d610f2291610c15565b5f915f905b828210610f4e57505090610ca882610ca8610f4884610ca86107099761088f565b96610881565b909260019060081b610f6f610c7d610c4d610c3f610cf089610ca88d610881565b17930190610f27565b60f710610f8f5750610efa610c7d61070992610bef565b90610c7d610f9c91610bdc565b5f915f905b828210610fc257505090610ca882610ca8610f4884610ca86107099761088f565b909260019060081b610fe3610c7d610c4d610c3f610cf089610ca88d610881565b17930190610fa1565b602003906020821161087c57565b5f1981019190821161087c57565b600381901b91906001600160fd1b0381160361087c57565b908151811015610ba85761103a610c4d610c3f8385610bb7565b60ff81169060a082036110615750506110528161089d565b825110610ba857016021015190565b909290607f84116110725750505090565b909192608081101590816110e4575b5015610ba857610c7d61109391610c02565b91826110a0575050505f90565b60208311610ba8576110b583610ca883610881565b825110610ba8576110d96110d460216001936110df9501015194610fec565b611008565b1b610ffa565b191690565b60b7915011155f611081565b908151811015610ba85760ff61110c610c4d610c3f8486610bb7565b1660948103611131575061111f816108ab565b825110610ba857016021015160601c90565b608014159150610ba89050575f9056fea26469706673582212203442124d0df02311cb58922c9be47fb59cbf572db3bad59cda1579e4d42802c664736f6c634300081e0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0xb049644b1d5a0ec9d785dd48f95099e0f566112084acb1ba0814112209b432a1", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000009": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "0x1c00000000000000000000000000000000000001": { + "nonce": "0x1", + "balance": "0x0", + "code": "0x60806040526004361015610011575f80fd5b5f3560e01c80631fbb25ad1461006457806379502c551461005f57806382648c3b1461005a57806397cac0fb146100555763a21de6d914610050575f80fd5b610236565b610176565b6100fa565b6100b6565b346100a8575f3660031901126100a8577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03166080908152602090f35b5f80fd5b5f9103126100a857565b346100a8575f3660031901126100a8576040517f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03168152602090f35b346100a8575f3660031901126100a85760205f54604051908152f35b9181601f840112156100a8578235916001600160401b0383116100a8576020808501948460051b0101116100a857565b9181601f840112156100a8578235916001600160401b0383116100a8576020808501948460071b0101116100a857565b346100a85760803660031901126100a8576004356001600160401b0381116100a857366023820112156100a8578060040135906001600160401b0382116100a85736602483830101116100a8576024356001600160401b0381116100a8576101e2903690600401610116565b6044929192356001600160401b0381116100a857610204903690600401610146565b91606435946001600160401b0386116100a8576102349661022b6024973690600401610116565b9790960161097b565b005b346100a8575f3660031901126100a8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b038211176102a957604052565b61027a565b90601f801991011681019081106001600160401b038211176102a957604052565b6001600160a01b038116036100a857565b908160209103126100a857516102f5816102cf565b90565b6040513d5f823e3d90fd5b908060209392818452848401375f828201840152601f01601f1916010190565b9160206102f5938181520191610303565b634e487b7160e01b5f52603260045260245ffd5b919081101561036a5760051b81013590607e19813603018212156100a8570190565b610334565b356102f5816102cf565b903590601e19813603018212156100a857018035906001600160401b0382116100a8576020019181360383136100a857565b9593916103d7906103e5946102f599979360018060a01b03168952608060208a01526080890191610303565b918683036040880152610303565b926060818503910152610303565b949290936104116102f5979561041f94606089526060890191610303565b918683036020880152610303565b926040818503910152610303565b919081101561036a5760051b81013590603e19813603018212156100a8570190565b6002111561045957565b634e487b7160e01b5f52602160045260245ffd5b3560028110156100a85790565b35906001600160801b03821682036100a857565b60ff8116036100a857565b6001600160401b0381116102a957601f01601f191660200190565b35906001600160a01b0319821682036100a857565b35906001600160801b0319821682036100a857565b919060a0838203126100a857604051906104f78261028e565b819380358352602081013561050b8161048e565b602084015260408101356001600160401b0381116100a857810182601f820112156100a85780359161053c83610499565b9361054a60405195866102ae565b838552602084840101116100a8576080935f60208561058b968289970183860137830101526040860152610580606082016104b4565b6060860152016104c9565b910152565b6020818303126100a8578035906001600160401b0382116100a8570160a0818303126100a857604051916105c38361028e565b81356105ce816102cf565b835260208201356105de816102cf565b60208401526105ef6040830161047a565b60408401526060820135606084015260808201356001600160401b0381116100a85761061b92016104de565b608082015290565b634e487b7160e01b5f52601160045260245ffd5b5f1981146106455760010190565b610623565b919081101561036a5760071b0190565b356102f58161048e565b519081151582036100a857565b908160209103126100a8576102f590610664565b604051906106946040836102ae565b600d82526c65636965732d6165732d6b657960981b6020830152565b91906040838203126100a85782516001600160401b0381116100a857830181601f820112156100a8578051916106e583610499565b906106f360405192836102ae565b838252602084840101116100a8575f6020846102f595828096018386015e830101529301610664565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b926107769060809360209397969786526bffffffffffffffffffffffff60a01b168386015260a0604086015260a085019061071c565b83810360608501525f815201936001600160801b031916910152565b9060028210156104595752565b92919060806040916107b2866001610792565b6060602087015260018060a01b03815116606087015260018060a01b03602082015116828701526001600160801b03838201511660a0870152606081015160c0870152015160a060e0860152805161010086015260ff60208201511661012086015261082e8282015160a06101408801526101a087019061071c565b60608201516001600160a01b0319166101608701526080909101516001600160801b031916610180860152930152565b6001600160a01b0390911681526001600160801b03909116602082015260400190565b908160a09103126100a85760806040519161089b8361028e565b80356108a6816102cf565b835260208101356108b6816102cf565b602084015260408101356108c9816102cf565b60408401526108da6060820161047a565b60608401520135608082015290565b60c09093929193608060e0820195610901835f610792565b80516001600160a01b039081166020858101919091528201518116604080860191909152820151166060808501919091528101516001600160801b031682840152015160a08201520152565b908160209103126100a8575190565b908160209103126100a857516001600160401b03811681036100a85790565b95919493929690331515806113c3575b6113b4577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b031696873b156100a85760405163fe77009960e01b8152915f91839182916109e3919060048401610323565b0381838b5af18015610b42576113a0575b505f9492945b818110611285575050505f54925f915f915b878310610ba85750505003610b99576040516381e3da6b60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166004808301919091526024820152602081604481865afa8015610b4257610b7c575b505f819055604051631014997960e31b815291602083600481845afa928315610b42575f93610b47575b50602060049160405192838092631d04645f60e01b82525afa8015610b42577f87977a3515c59199065d0e2d7837b95d8fcf5fb072c0321138df0786011e32c4926001600160401b03925f92610b0d575b5060408051968752602087019190915291169390819081015b0390a3565b610b08919250610b349060203d602011610b3b575b610b2c81836102ae565b81019061095c565b9190610aef565b503d610b22565b6102f8565b6004919350610b6d602091823d8411610b75575b610b6581836102ae565b81019061094d565b939150610a9e565b503d610b5b565b610b949060203d602011610b7557610b6581836102ae565b610a74565b6361aba18160e11b5f5260045ffd5b909194610bb686898561042d565b610bbf8161046d565b610bc88161044f565b610d6957610bdd816020610be5930190610379565b810190610881565b90604051610c0a81610bfc602082019486866108e9565b03601f1981018352826102ae565b5190208151909690610c3290610c26906001600160a01b031681565b6001600160a01b031690565b6040830180519091906001600160a01b0316906060850191610c5b83516001600160801b031690565b823b156100a857610c85925f92836040518096819582946340c10f1960e01b84526004840161085e565b03925af18015610b42576001958b927fd5277bc9597c7da3fab9cdbba4de6005f48b9eb7389cf2389c4ea9eea3172c2192610d4f575b506020810151610cdc906001600160a01b031695516001600160a01b031690565b8151610d4390608090610d00906001600160a01b031697516001600160801b031690565b930151604080516001600160a01b0390981688526001600160801b0390941660208801529286019290925260a088901b8890039081169516939081906060820190565b0390a45b019190610a0c565b80610d5d5f610d63936102ae565b806100ac565b5f610cbb565b610d7d816020610d85939994990190610379565b810190610590565b908585101561127657610e3796610da6610d9e87610637565b96888661064a565b6060840160406020610db88351611483565b929094608089019d8e51610dd185825192015160ff1690565b95833598610de087860161065a565b8651635f8a996960e01b8152600481019490945260ff9889166024850152604484018b905288166064840152608483015290951660a48601529101803560c48501526020013560e484015282908190610104820190565b0381731c000000000000000000000000000000000001005afa908115610b42575f91611248575b501561123957518951516040516bffffffffffffffffffffffff197f000000000000000000000000000000000000000000000000000000000000000060601b166020820152603481019290925260548083019190915281525f91610ed69190610ec86074836102ae565b610ed0610685565b906115f4565b98518099610f2e610f1360806040610f0060608701516bffffffffffffffffffffffff60a01b1690565b9501519d01516001600160801b03191690565b60405163f4a7eb1360e01b81529c8d94859460048601610740565b0381731c000000000000000000000000000000000001015afa978815610b42575f905f99611212575b505f808a80611207575b156111fb575050610f7190611660565b90915b604051610f8a81610bfc6020820194898661079f565b5190209861109c5750508151610faa90610c26906001600160a01b031681565b602083018051909391906001600160a01b0316916040810192610fd484516001600160801b031690565b833b156100a857610ffe935f92836040518097819582946340c10f1960e01b84526004840161085e565b03925af1908115610b425761106861105a61104c6001988e967f95705d99ac13cf82894fd274cd871942e6f301c98c186271337e8fedbbb9d7ea96611088575b50516001600160a01b031690565b92516001600160a01b031690565b94516001600160801b031690565b90611080604051928392898060a01b0316968361085e565b0390a3610d47565b80610d5d5f611096936102ae565b5f61103e565b83516110b290610c26906001600160a01b031681565b9060408501926110c984516001600160801b031690565b833b156100a8575f6110f58d9582936040519485809481936340c10f1960e01b8352896004840161085e565b03925af190816111e7575b50611140575050835161111e9150610c26906001600160a01b031681565b6020840180519094906001600160a01b031683516001600160801b0316610fd4565b859392917ffc236d1b4402e76c2b0a882db36ad3a6fb0f5b6b7edc8ae317d993f10434c436916111df6111a0611192611184602060019c015160018060a01b031690565b98516001600160a01b031690565b96516001600160801b031690565b604080516001600160a01b0390981688526001600160801b03909116602088015286019290925260a088901b8890039081169516939081906060820190565b0390a4610d47565b80610d5d5f6111f5936102ae565b5f611100565b91509198505f98610f74565b506040835114610f61565b90506112319198503d805f833e61122981836102ae565b8101906106b0565b97905f610f57565b63fb1f4a4960e01b5f5260045ffd5b611269915060203d811161126f575b61126181836102ae565b810190610671565b5f610e5e565b503d611257565b6351de8c1f60e01b5f5260045ffd5b611293818385989698610348565b9061129d8261036f565b9160208101906112ad8282610379565b909260408301936112be8585610379565b91909760608601986112d08a88610379565b9061083f60921b3b156100a8575f956112fe93604051998a9788976374ae5b3760e11b8952600489016103ab565b03818361083f60921b5af18015610b42576001967f4ac4dcc08b0c26c3fb6b58c64c1392b7934b1ce6b0382a5986ea5c3de795e05394611361946113809361138c575b506113696113586113518361036f565b9583610379565b96909883610379565b939092610379565b9290916040519687968c8060a01b031699876103f3565b0390a2019492946109fa565b80610d5d5f61139a936102ae565b5f611341565b80610d5d5f6113ae936102ae565b5f6109f4565b63bb62587160e01b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa908115610b42575f91611423575b506001600160a01b031633141561098b565b611445915060203d60201161144b575b61143d81836102ae565b8101906102e0565b5f611411565b503d611433565b908160011b918083046002149015171561064557565b906001820180921161064557565b9190820180921161064557565b6114b4906114ae60405160208101906114a581610bfc84906006602083019252565b51902091611452565b90611476565b9061153d6114c183611468565b6040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000818116600484015260248301969096527f0000000000000000000000001c0000000000000000000000000000000000000016949092909190602090849081906044820190565b0381885afa928315610b42575f936115c1575b508215611239576040516381e3da6b60e01b81526001600160a01b03929092166004830152602482015292602090849060449082905afa928315610b42575f9361159d575b509160ff1690565b60ff9193506115ba9060203d602011610b7557610b6581836102ae565b9290611595565b6115db91935060203d602011610b7557610b6581836102ae565b915f611550565b805191908290602001825e015f815290565b9161164860016116226102f595611633956040519160208301526020825261161d6040836102ae565b6116a9565b9260405194859160208301906115e2565b8260f81b815203601e198101855201836102ae565b6040519060208201526020815261161d6040826102ae565b9081516040810361167c57506034602083015160601c92015190565b633fbbeba160e21b5f52600452604060245260445ffd5b6102f593926040928252602082015201906115e2565b5f908051604081115f146117b557505f6116cb602092604051918280926115e2565b039060025afa15610b425760205f611746610bfc61173a8351965b6040519283917f363636363636363636363636363636363636363636363636363636363636363689187f36363636363636363636363636363636363636363636363636363636363636368b18898501611693565b604051918280926115e2565b039060025afa15610b42576117a57f5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c61173a5f93610bfc6020968651908560405196879518911889850191606093918352602083015260408201520190565b039060025afa15610b42575f5190565b602080830151949082119350916001841461182457505f925b6020821061180e575b60408210166117f4575b505f611746610bfc61173a6020946116e6565b600160409190910360031b1b5f190119909116905f6117e1565b935f1960018360200360031b1b011916936117d7565b60400151926117ce56fea26469706673582212202d7871f3ae92f209a5f2c5b2ec70a94de81adadb1ab2f79b2e3bf13150db4d3864736f6c634300081e0033" + }, + "0x1c00000000000000000000000000000000000002": { + "nonce": "0x1", + "balance": "0x0", + "code": "0x60806040526004361015610011575f80fd5b5f3560e01c80632c37826e14610134578063340652721461012f578063378fa8fa1461012a57806343c3cb831461012557806348aa41081461012057806353a8d7391461011b578063545525f11461011657806379502c551461011157806379fa32891461010c5780637b9c9aa414610107578063a94cd93114610102578063b3b200aa146100fd578063b79a6c0c146100f8578063bba9282e146100f3578063c9b6ca9b146100ee578063ce7025e9146100e9578063d93af1d2146100e45763f490ca96146100df575f80fd5b6107a7565b610785565b61070c565b6106f0565b6106c8565b6105ea565b610552565b6104c0565b610442565b6102c4565b610254565b610237565b61021b565b6101c1565b6101a6565b61018b565b610166565b610147565b5f91031261014357565b5f80fd5b34610143575f3660031901126101435760205f5460c01c604051908152f35b34610143575f3660031901126101435760206001600160801b035f5416604051908152f35b34610143575f36600319011261014357602060405160218152f35b34610143575f36600319011261014357602060405160718152f35b34610143575f366003190112610143575f60206040516101e0816107dd565b8281520152604080516101f2816107dd565b6001600160401b0360015491828152602082600254169101908152835192835251166020820152f35b34610143575f3660031901126101435760206040516104008152f35b34610143575f366003190112610143576020600554604051908152f35b34610143575f366003190112610143576040517f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03168152602090f35b600435906001600160801b038216820361014357565b604435906001600160801b038216820361014357565b34610143576020366003190112610143576102dd610298565b33151580610382575b61037357670de0b6b3a76400006001600160801b038216116103645761035f816103457f6f864cce5237e12ffc9a99fc6c59af17222c2bbb3457690cc8753ab16b5d715e936001600160801b03166001600160801b03195f5416175f55565b6040516001600160801b0390911681529081906020820190565b0390a1005b630d62f21160e11b5f5260045ffd5b63bb62587160e01b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa908115610411575f916103e2575b506001600160a01b03163314156102e6565b610404915060203d60201161040a575b6103fc81836107fd565b81019061084f565b5f6103d0565b503d6103f2565b610867565b608435906001600160401b038216820361014357565b602435906001600160401b038216820361014357565b34610143576020366003190112610143576004356001600160401b0381168103610143576104716020916108a9565b6001600160801b0360405191168152f35b6001600160a01b0381160361014357565b9181601f84011215610143578235916001600160401b038311610143576020838186019501011161014357565b346101435760e0366003190112610143576004356104dd81610482565b602435906104ea82610482565b6104f26102ae565b916064356104fe610416565b60a4359161050b83610482565b60c435956001600160401b03871161014357610538610531610550983690600401610493565b3691610909565b94604051966105486020896107fd565b5f8852610ea3565b005b34610143576101003660031901126101435760043561057081610482565b60243561057c81610482565b6105846102ae565b91606435610590610416565b9060a43561059d81610482565b60c4356001600160401b038111610143576105bc903690600401610493565b93909260e435976001600160401b038911610143576105e2610550993690600401610493565b98909761093f565b346101435760203660031901126101435760043533151580610649575b6103735761035f816106397f4f0c4dec68e1e774843a5fc3a522ab2a832ecfc975b9ad8a5033736d9e47f09d93600555565b6040519081529081906020820190565b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa908115610411575f916106a9575b506001600160a01b0316331415610607565b6106c2915060203d60201161040a576103fc81836107fd565b5f610697565b34610143575f3660031901126101435760206001600160401b035f5460801c16604051908152f35b34610143575f36600319011261014357602060405161c3508152f35b346101435760603660031901126101435760043561072861042c565b604435916001600160401b0383116101435736602384011215610143578260040135916001600160401b038311610143573660248460051b860101116101435761077b6106399360246107819601610966565b9161159a565b0390f35b34610143575f36600319011261014357602061079f610a03565b604051908152f35b34610143575f366003190112610143576020604051670de0b6b3a76400008152f35b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b038211176107f857604052565b6107c9565b90601f801991011681019081106001600160401b038211176107f857604052565b6040519061082e610160836107fd565b565b6040519061082e610140836107fd565b6040519061082e6040836107fd565b90816020910312610143575161086481610482565b90565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b036001911601906001600160401b0382116108a457565b610872565b6001600160401b031661c350016001600160401b0381116108a4576001600160401b036001600160801b035f54169116026001600160801b0381169081036108a45790565b6001600160401b0381116107f857601f01601f191660200190565b929192610915826108ee565b9161092360405193846107fd565b829481845281830111610143578281602093845f960137010152565b9761095861096092939495969761082e9b993691610909565b973691610909565b96610ea3565b6001600160401b0382116107f8578160051b906040519261098a60208401856107fd565b835260208301918101903682116101435780925b8284106109ac575050505090565b83356001600160401b03811161014357820136601f82011215610143576020916109dd839236908481359101610909565b81520193019261099e565b5f198101919082116108a457565b919082039182116108a457565b6004546003549081811015610a1e5781039081116108a45790565b50505f90565b5f1981146108a45760010190565b906001600160801b03809116911601906001600160801b0382116108a457565b90816020910312610143575190565b90816020910312610143575180151581036101435790565b634e487b7160e01b5f52603260045260245ffd5b600354811015610aa95760035f52600960205f20910201905f90565b610a79565b8054821015610aa9575f52600960205f20910201905f90565b634e487b7160e01b5f525f60045260245ffd5b90600182811c92168015610b08575b6020831014610af457565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610ae9565b818110610b1d575050565b5f8155600101610b12565b9190601f8111610b3757505050565b61082e925f5260205f20906020601f840160051c83019310610b61575b601f0160051c0190610b12565b9091508190610b54565b91909182516001600160401b0381116107f857610b9281610b8c8454610ada565b84610b28565b6020601f8211600114610bd1578190610bc29394955f92610bc6575b50508160011b915f199060031b1c19161790565b9055565b015190505f80610bae565b601f19821690610be4845f5260205f2090565b915f5b818110610c1e57509583600195969710610c06575b505050811b019055565b01515f1960f88460031b161c191690555f8080610bfc565b9192602060018192868b015181550194019201610be7565b600354680100000000000000008110156107f857806001610c5c92016003556003610aae565b610de457815181546001600160a01b0319166001600160a01b0390911617815561082e916008906101409060208101516001850180546001600160a01b0319166001600160a01b039092169190911790556040810151600285015560608101516003850180546001600160a01b0319166001600160a01b03909216919091179055610d4560048501610d17610cfb60808501516001600160801b031690565b82546001600160801b0319166001600160801b03909116178255565b60a08301516001600160801b031681546001600160801b031660809190911b6001600160801b031916179055565b60c08101516005850155610dc960068501610d8a610d6d60e08501516001600160401b031690565b825467ffffffffffffffff19166001600160401b03909116178255565b6101008301516001600160a01b0316815468010000000000000000600160e01b03191660409190911b68010000000000000000600160e01b0316179055565b610ddb61012082015160078601610b6b565b01519101610b6b565b610ac7565b6001600160401b03166001600160401b0381146108a45760010190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6001600160a01b03918216815291811660208301526001600160801b03928316604083015292909116606082015260808101929092526001600160401b039290921660a0820152911660c082015261012060e08201819052610864939192610e9491840190610e06565b91610100818403910152610e06565b95969092949693919360018060a01b038816156111bd576104008151116111ae57610ecd8261194f565b60055461115b575b610ede836108a9565b97610ee98987610a32565b60405163868a2e9d60e01b8152979094906020896004815f60056007609a1b015af1988915610411575f9961112a575b50881561111b576040516323b872dd60e01b81523360048201523060248201526001600160801b03871660448201526001600160a01b038b16906020816064815f865af1908115610411575f916110ec575b50156110dd57803b1561014357604051630852cd8d60e31b81526001600160801b039790971660048801525f908790602490829084905af18015610411577f348c28d1410ff29393c038fe0f1998384082e98e315624b24c04a4fa6288b9de996110be9761105f926110c3575b50610fe161081e565b6001600160a01b038d1681529033602083015260408201526001600160a01b03891660608201526001600160801b038a1660808201526001600160801b038d1660a082015260c081018390526001600160401b03841660e08201526001600160a01b0385166101008201528561012082015286610140820152610c36565b5f5460801c6001600160401b03169a6110a661107a8d610de9565b5f805467ffffffffffffffff60801b191660809290921b67ffffffffffffffff60801b16919091179055565b6040519889986001600160401b03339e169c8a610e2a565b0390a3565b806110d15f6110d7936107fd565b80610139565b5f610fd8565b6312171d8360e31b5f5260045ffd5b61110e915060203d602011611114575b61110681836107fd565b810190610a61565b5f610f6b565b503d6110fc565b632968ee7f60e21b5f5260045ffd5b61114d91995060203d602011611154575b61114581836107fd565b810190610a52565b975f610f19565b503d61113b565b6007544303611197575b6006546005548110156111885761117e61118391610a24565b600655565b610ed5565b63124ab48560e11b5f5260045ffd5b6111a043600755565b6111a95f600655565b611165565b634b8a874d60e11b5f5260045ffd5b63c29f0c7160e01b5f5260045ffd5b919082018092116108a457565b9060405191825f8254926111ec84610ada565b80845293600181169081156112555750600114611211575b5061082e925003836107fd565b90505f9291925260205f20905f915b81831061123957505090602061082e928201015f611204565b6020919350806001915483858901015201910190918492611220565b90506020925061082e94915060ff191682840152151560051b8201015f611204565b90611377600861128561081e565b84546001600160a01b031681529360018101546001600160a01b031660208601526002810154604086015260038101546001600160a01b031660608601526113076112f760048301546112f16112e1826001600160801b031690565b6001600160801b031660808a0152565b60801c90565b6001600160801b031660a0870152565b600581015460c086015261135f61134e600683015461133f61132f826001600160401b031690565b6001600160401b031660e08a0152565b60401c6001600160a01b031690565b6001600160a01b0316610100870152565b61136b600782016111d9565b610120860152016111d9565b610140830152565b8051821015610aa95760209160051b010190565b604080825282516001600160a01b0316908201529291906020906114589080830151606087015260408101516001600160a01b0316608087015260608101516001600160801b031660a087015260808101516001600160801b031660c087015260a081015160e087015260c08101516001600160401b031661010087015260e08101516001600160a01b0316610120870152610120611443610100830151610140808a0152610180890190610e06565b910151868203603f1901610160880152610e06565b930152565b6114678154610ada565b9081611471575050565b81601f5f9311600114611482575055565b8183526020832061149e91601f0160051c810190600101610b12565b808252602082209081548360011b9084198560031b1c191617905555565b90610de4576008815f61082e93555f60018201555f60028201555f60038201555f60048201555f60058201555f60068201556114fa6007820161145d565b0161145d565b6003545f6003558061150f5750565b806009029060098204036108a45760035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b908101905b818110611552575050565b6009905f81555f60018201555f60028201555f60038201555f60048201555f60058201555f60068201556115886007820161145d565b6115946008820161145d565b01611547565b9092915f93331515806118d0575b610373576001600160401b038043169116036118c157600354906115cf60045480936109f6565b8084116118b9575b5080518381036118a25750826116af575b5050506116256116016115fc5f5460c01c90565b610886565b5f80546001600160c01b031660c09290921b6001600160c01b031916919091179055565b817fec4aff46c65f485f4b15e3c2edadda1d57d002995f5aa262a27c76b9a680ec166116aa6116555f5460c01c90565b611690611660610840565b8581526001600160401b038316602090910181905260018690556002805467ffffffffffffffff19169091179055565b6040516001600160401b0390911681529081906020820190565b0390a2565b5f199450916116be90826111cc565b91825b8281116116f857505050600455600454600354146116e2575b5f80806115e8565b6116ea611500565b6116f35f600455565b6116da565b611701816109e8565b9561170b87610a8d565b5061171590611277565b61171f85896109f6565b611729908561137f565b51806101408301519061173b916119c4565b8151602080840151604080860151905160609290921b6bffffffffffffffffffffffff191692820192835260348083019190915281526001600160a01b0390921693916117896054826107fd565b51902060608201519091906001600160a01b031660808201516001600160801b031660a08301516001600160801b031660c08401519160e08501516117d4906001600160401b031690565b6101008601519094906001600160a01b0316956101200151966117f5610830565b6001600160a01b03909a168a5260208a01526001600160a01b031660408901526001600160801b031660608801526001600160801b0316608087015260a08601526001600160401b031660c08501526001600160a01b031660e0840152610100830152610120820152604051809160208201936118729185611393565b03601f198101825261188490826107fd565b5190209561189190610a8d565b61189a916114bc565b5f19016116c1565b630db2128560e11b5f52600452602483905260445ffd5b92505f6115d7565b631391e11b60e21b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa908115610411575f91611930575b506001600160a01b03163314156115a8565b611949915060203d60201161040a576103fc81836107fd565b5f61191e565b805180156119c0576021036119a257805115610aa95760208101516001600160f81b031916600160f91b81141590816119b1575b506119a257611998602161199c920151611a46565b1590565b6119a257565b6361d0136b60e11b5f5260045ffd5b600360f81b141590505f611983565b5050565b516119ed575f905b518181036119d8575050565b63521a2d4d60e11b5f5260045260245260445ffd5b6071906119cc565b3d15611a1f573d90611a06826108ee565b91611a1460405193846107fd565b82523d5f602084013e565b606090565b602081519101519060208110611a38575090565b5f199060200360031b1b1690565b80158015611b04575b611af3575f8091604051611ac981611abb602082019460076401000003d019916401000003d019906401000003d019818009090860208087528087018190526040870152606086015263800001e9600160ff1b0360808601526401000003d01960a086015260c0850190565b03601f1981018352826107fd565b519060055afa611ad76119f5565b90158015611af8575b611af357611aef600191611a24565b1490565b505f90565b50602081511415611ae0565b506401000003d019811015611a4f56fea26469706673582212200bfcf3456a7ce33a5e3ce98ab47611a42a6a1ec4845e29b731555ceca2ddcf6c64736f6c634300081e0033" + }, + "0x1c00000000000000000000000000000000000003": { + "nonce": "0x1", + "balance": "0x0", + "code": "0x6080806040526004361015610012575f80fd5b5f3560e01c9081631beb1ab814610561575080631fbb25ad1461051d5780633488ce0d146102dd5780635c1bba381461023b5780636d46e98714610193578063a21de6d91461014f5763e202d99514610069575f80fd5b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260016024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d575b6040516001600160a01b039091168152602090f35b506020813d60201161013c575b816101276020938361067c565b8101031261013857602090516100f8565b5f80fd5b3d915061011a565b6040513d5f823e3d90fd5b34610138575f366003190112610138576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169081900361013857604051630b83774760e31b8152602081600481305afa908115610144575f916101f6575b506040516001600160a01b039091169091148152602090f35b90506020813d602011610233575b816102116020938361067c565b810103126101385751906001600160a01b0382168203610138579060206101dd565b3d9150610204565b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d576040516001600160a01b039091168152602090f35b34610138575f366003190112610138576040516381e3da6b60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038181166004840152600660248401527f0000000000000000000000001c00000000000000000000000000000000000000169190602082604481865afa918215610144575f926104e9575b5081156104da576040516020810190600682526020815261038f60408261067c565b519020915f1981019081116104c6578060011b90808204600214901517156104c65782018092116104c65760018201908183116104c6576040516381e3da6b60e01b81526001600160a01b03821660048201526024810193909352602083604481875afa928315610144575f9361048e575b506040516381e3da6b60e01b81526001600160a01b03909116600482015260248101919091529160209083908180604481015b03915afa918215610144575f92610459575b5060ff6040928351928352166020820152f35b91506020823d602011610486575b816104746020938361067c565b810103126101385790519060ff610446565b3d9150610467565b919092506020823d6020116104be575b816104ab6020938361067c565b8101031261013857905191610434610401565b3d915061049e565b634e487b7160e01b5f52601160045260245ffd5b630c322fb560e31b5f5260045ffd5b9091506020813d602011610515575b816105056020938361067c565b810103126101385751908361036d565b3d91506104f8565b34610138575f366003190112610138576040517f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169190829003610138576105fe9181602080930191825260076040820152604081526105ab60608261067c565b5190206040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152602481019190915291829081906044820190565b03817f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03165afa8015610144575f90610649575b60209060ff604051911615158152f35b506020813d602011610674575b816106636020938361067c565b810103126101385760209051610639565b3d9150610656565b90601f8019910116810190811067ffffffffffffffff82111761069e57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220464f1b8a737fa9a2c20ce545542112d8168c49bb38b8810823d6ece805b6968d64736f6c634300081e0033" + }, + "0x1c00000000000000000000000000000000000004": { + "nonce": "0x1", + "balance": "0x0", + "code": "0xfe" + }, + "0x20c0000000000000000000000000000000000000": { + "nonce": "0x0", + "balance": "0x0", + "code": "0xef", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x706174685553440000000000000000000000000000000000000000000000000e", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x706174685553440000000000000000000000000000000000000000000000000e", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x5553440000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000010000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000000000000000000000000000000000000d": "0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff", + "0x1a08d1eefb6dea6eba7c6c1f53fa17f31dc24b9efe98e97550f0dad434642618": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x353fe882519f79b8caf8d301c26c19d663ae2e691ca2e75dc341b346d5d22c63": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x983ee3ed0ac6ffe1e6626c807d5dad57db7645721c041f19b39c3f728acefdd7": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x9a3d8dc9bf2bb7465d975ea80af65f820bc69e3b43668ac11765d4e28cf9333a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xad6e221fb67208b50def8b13e82392da7f9eaacd7b17f77c8bfdc7df401bc3d8": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xbd1422d956203483f6a77a55f068041e264cef0ec8c355db258a1fb8f4169a51": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc39d774f18115b85b81494d65e588b565d73abc969333d1da7b0a0eb0729accd": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + }, + "0x20fc000000000000000000000000000000000000": { + "nonce": "0x0", + "balance": "0x0", + "code": "0xef" + }, + "0x403c000000000000000000000000000000000000": { + "nonce": "0x0", + "balance": "0x0", + "code": "0xef" + }, + "0x4e4f4e4345000000000000000000000000000000": { + "nonce": "0x0", + "balance": "0x0", + "code": "0xef" + }, + "0xaaaaaaaa00000000000000000000000000000000": { + "nonce": "0x0", + "balance": "0x0", + "code": "0xef" + }, + "0xca11bde05977b3631167028862be2a173976ca11": { + "nonce": "0x1", + "balance": "0x0", + "code": "0x6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033" + }, + "0xdec0000000000000000000000000000000000000": { + "nonce": "0x0", + "balance": "0x0", + "code": "0xef" + }, + "0xfeec000000000000000000000000000000000000": { + "nonce": "0x0", + "balance": "0x0", + "code": "0xef", + "storage": { + "0xabd7b398c2237712843e3e780dcd40dfb99446b30666f04c025da4efa5ce5177": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "baseFeePerGas": "0x2540be400" +} \ No newline at end of file diff --git a/docs/pages/protocol/privacy/crypto-review.md b/docs/pages/protocol/privacy/crypto-review.md new file mode 100644 index 000000000..91d66b1f6 --- /dev/null +++ b/docs/pages/protocol/privacy/crypto-review.md @@ -0,0 +1,385 @@ +# Cryptography review checklist + +This document lists the cryptographic constructions in the zone privacy specification that require expert review. The focus is on spec-level correctness — whether the protocols are sound, the parameters are safe, and the trust assumptions are clearly stated. + +For each construction, we include the security model and an extract of the spec sections a reviewer should read. + +--- + +## 1. Encrypted deposits (ECIES + Chaum-Pedersen) + +### Security model + +**Functionality**: Users can deposit tokens into a zone while hiding the recipient address and memo. The construction provides three guarantees: + +1. **Correct encryption → recipient is credited.** If the user correctly encrypts `(to, memo)` to the sequencer's published encryption key, the zone credits `to` with the deposited amount. If the mint to `to` fails (e.g. the recipient is blocked by TIP-403 token policy), the zone falls back to crediting the depositor instead. The sequencer cannot selectively reject a correctly encrypted deposit without halting the processing of *all* deposits — the deposit queue is an ordered hash chain, so skipping one deposit means all subsequent deposits stall. + +2. **Incorrect encryption → refund on L1.** If the ciphertext is malformed, encrypted to the wrong key, or otherwise fails decryption, the deposit amount is minted to the `sender` address on the zone (the same account that deposited on L1). The L1 funds remain escrowed in the portal. Chain progress is never blocked by invalid encrypted deposits. + +3. **Sequencer cannot lie about decryption.** The sequencer provides the ECDH shared secret and a Chaum-Pedersen DLEQ proof that it was correctly derived. The AES-GCM authentication tag then verifies the decrypted plaintext. Together, these prevent the sequencer from claiming a deposit decrypts to a different `(to, memo)` — the GCM tag would fail. The only attack is refusing to process at all, which triggers the refund path. + +**Trust assumptions**: +- The sequencer's encryption key is registered on-chain with a proof-of-possession (ECDSA signature). Users trust this key is honestly generated. +- The `token`, `sender`, and `amount` fields are always public (needed for on-chain escrow accounting). Only `to` and `memo` are encrypted. +- A compromised sequencer private key exposes all past and future encrypted deposit recipients until key rotation. Old keys remain valid for a grace period (86,400 blocks ≈ 1 day). Deposits using a compromised old key during the grace period are retroactively exposed. + +**Cryptographic components** (reviewed together because they form a single verification pipeline): +- **ECIES**: secp256k1 ECDH + HKDF-SHA256 + AES-256-GCM — encrypts `(to, memo)`. +- **Chaum-Pedersen DLEQ proof**: non-interactive sigma protocol (Fiat-Shamir) — proves the sequencer used the correct private key for ECDH, preventing griefing with deposits encrypted to the wrong key. +- **Secp256k1 point validation**: Euler's criterion via MODEXP precompile — validates ephemeral public keys on the portal to prevent invalid-point griefing. + +### Spec extract + +**Encryption scheme** (ECIES with secp256k1): + +1. Sequencer publishes a secp256k1 encryption public key via `setSequencerEncryptionKey(x, yParity, popV, popR, popS)` with a proof-of-possession (ECDSA signature over `keccak256(abi.encode(portalAddress, x, yParity))` by the corresponding private key). +2. User generates an ephemeral keypair and derives a shared secret via ECDH. +3. AES-256 key derived via HKDF-SHA256 with salt `"ecies-aes-key"` and info `abi.encodePacked(tempoPortal, keyIndex, ephemeralPubkeyX)`. +4. Plaintext `(to || memo || padding)` = 64 bytes (20 addr + 32 memo + 12 zero padding) encrypted with AES-256-GCM (empty AAD, user-chosen 12-byte nonce). +5. User calls `depositEncrypted(token, amount, keyIndex, encryptedPayload)` on the portal. + +**On-chain types** (`IZone.sol`): + +```solidity +struct EncryptedDepositPayload { + bytes32 ephemeralPubkeyX; // Ephemeral public key X coordinate (for ECDH) + uint8 ephemeralPubkeyYParity; // Y coordinate parity (0x02 or 0x03) + bytes ciphertext; // AES-256-GCM encrypted (to || memo || padding) + bytes12 nonce; // GCM nonce + bytes16 tag; // GCM authentication tag +} + +struct EncryptedDeposit { + address token; // TIP-20 token (public, for escrow accounting) + address sender; // Depositor (public, for refunds) + uint128 amount; // Amount (public, for accounting) + uint256 keyIndex; // Index of encryption key used (specified by depositor) + EncryptedDepositPayload encrypted; +} + +struct DecryptionData { + bytes32 sharedSecret; // ECDH shared secret (x-coordinate of privSeq * ephemeralPub) + uint8 sharedSecretYParity; // Y coordinate parity of the shared secret point (0x02 or 0x03) + ChaumPedersenProof cpProof; // Proof of correct shared secret derivation +} + +struct ChaumPedersenProof { + bytes32 s; // Response: s = r + c * privSeq (mod n) + bytes32 c; // Challenge: c = hash(G, ephemeralPub, pubSeq, sharedSecretPoint, R1, R2) +} +``` + +**On-chain verification pipeline** (`ZoneInbox.sol`, `advanceTempo`): + +```solidity +// Step 1: Verify Chaum-Pedersen DLEQ proof — proves shared secret was derived correctly +(bytes32 seqPubX, uint8 seqPubYParity) = _readEncryptionKey(ed.keyIndex); +bool proofValid = IChaumPedersenVerify(CHAUM_PEDERSEN_VERIFY).verifyProof( + ed.encrypted.ephemeralPubkeyX, + ed.encrypted.ephemeralPubkeyYParity, + dec.sharedSecret, + dec.sharedSecretYParity, + seqPubX, + seqPubYParity, + dec.cpProof +); +if (!proofValid) revert InvalidSharedSecretProof(); + +// Step 2: Derive AES key from shared secret using HKDF-SHA256 +bytes32 aesKey = _hkdfSha256( + dec.sharedSecret, + "ecies-aes-key", + abi.encodePacked(tempoPortal, ed.keyIndex, ed.encrypted.ephemeralPubkeyX) +); + +// Step 3: Decrypt using AES-256-GCM precompile +(bytes memory decryptedPlaintext, bool valid) = IAesGcmDecrypt(AES_GCM_DECRYPT).decrypt( + aesKey, ed.encrypted.nonce, ed.encrypted.ciphertext, "", ed.encrypted.tag +); + +// Step 4: Decode the decrypted (to, memo) from the plaintext +address decryptedTo; +bytes32 decryptedMemo; +if (valid && decryptedPlaintext.length == ENCRYPTED_PAYLOAD_PLAINTEXT_SIZE) { + (decryptedTo, decryptedMemo) = + EncryptedDepositLib.decodePlaintext(decryptedPlaintext); +} else { + valid = false; +} + +// Step 5: Mint to decrypted recipient on success, or refund to sender on failure. +// If the mint to decryptedTo fails (e.g. TIP-403 policy rejects the recipient), +// fall back to crediting the depositor. +if (!valid) { + IZoneToken(ed.token).mint(ed.sender, ed.amount); +} else { + try IZoneToken(ed.token).mint(decryptedTo, ed.amount) {} catch { + IZoneToken(ed.token).mint(ed.sender, ed.amount); + } +} +``` + +The sequencer's public key (`seqPubX`, `seqPubYParity`) is looked up on-chain via `_readEncryptionKey(ed.keyIndex)`, which reads from the portal's storage through `TempoState.readTempoStorageSlot`. It is not supplied by the sequencer in `DecryptionData`, preventing substitution attacks. + +**Chaum-Pedersen DLEQ protocol**: + +Proves knowledge of `privSeq` such that `pubSeq = privSeq * G` AND `sharedSecretPoint = privSeq * ephemeralPub`: + +1. **Prover (sequencer) computes off-chain:** + - Pick random `r` + - `R1 = r * G` + - `R2 = r * ephemeralPub` + - `c = hash(G, ephemeralPub, pubSeq, sharedSecretPoint, R1, R2)` (Fiat-Shamir challenge) + - `s = r + c * privSeq (mod n)` + - Proof is `(s, c)` + +2. **Verifier (on-chain precompile at `0x1C00...0100`) checks:** + - Reconstruct: `R1 = s*G - c*pubSeq` + - Reconstruct: `R2 = s*ephemeralPub - c*sharedSecretPoint` + - Recompute: `c' = hash(G, ephemeralPub, pubSeq, sharedSecretPoint, R1, R2)` + - Verify: `c == c'` + +**Precompile interface** (`IZone.sol`): + +```solidity +interface IChaumPedersenVerify { + function verifyProof( + bytes32 ephemeralPubX, + uint8 ephemeralPubYParity, + bytes32 sharedSecret, + uint8 sharedSecretYParity, + bytes32 sequencerPubX, + uint8 sequencerPubYParity, + ChaumPedersenProof calldata proof + ) external view returns (bool valid); +} +``` + +**HKDF-SHA256 implementation** (`ZoneInbox.sol`): + +```solidity +function _hkdfSha256(bytes32 ikm, bytes memory salt, bytes memory info) + internal view returns (bytes32 okm) +{ + // HKDF-Extract: PRK = HMAC-SHA256(salt, IKM) + bytes32 prk = _hmacSha256(salt, abi.encodePacked(ikm)); + // HKDF-Expand: OKM = HMAC-SHA256(PRK, info || 0x01) + bytes memory expandInput = bytes.concat(info, hex"01"); + okm = _hmacSha256(abi.encodePacked(prk), expandInput); +} +``` + +**Ephemeral pubkey validation** (`ZonePortal.sol`): + +The portal validates the ephemeral public key X coordinate is on secp256k1 using Euler's criterion via the MODEXP precompile: `(x³ + 7)^((p-1)/2) ≡ 1 (mod p)`. This prevents griefing with invalid points that would make ECDH and Chaum-Pedersen proofs impossible. + +**Key rotation** (`ZonePortal.sol`): + +Old encryption keys expire after `ENCRYPTION_KEY_GRACE_PERIOD = 86,400` blocks (~1 day at 1s block time). The current key never expires. Users specify `keyIndex` at signing time to avoid race conditions during rotation. Deposits using expired keys are rejected with `EncryptionKeyExpired`. + +--- + +## 2. Authenticated withdrawals — sender tag + +### Security model + +**Functionality**: Hide the identity of the withdrawal sender from public observers on Tempo Mainnet, while allowing the sender to selectively disclose their identity to chosen parties. + +**Trust assumptions**: +- The sequencer computes `senderTag` and includes it in the `Withdrawal` struct. The struct is hashed into the withdrawal queue chain committed in the batch proof. **The sequencer is trusted to compute the tag correctly.** A malicious sequencer could forge tags attributing withdrawals to wrong senders, or produce unverifiable tags. The batch proof would still be valid since the prover does not verify the tag's preimage. +- This is a modest extension of the existing trust model: the sequencer is already trusted for liveness, transaction ordering, and withdrawal processing. +- The blinding factor `txHash` is known to the sequencer and anyone with zone data access. The threat model relies on zone transaction data not being published on L1. +- To upgrade to trustless sender authentication, `senderTag` computation can be moved into the ZK circuit. The encryption would remain sequencer-mediated. + +**Threat surface**: +- An observer who learns `txHash` (e.g., from a compromised sequencer) can deanonymize the sender. +- The commitment is hiding under the assumption that `txHash` is uniformly random and secret. Since `txHash = keccak256(transaction)`, it is uniformly distributed, but secrecy depends entirely on zone data privacy. + +### Spec extract + +**Sender tag computation** (overview.md §"Authenticated withdrawals", `ZoneOutbox.sol` line 362): + +``` +senderTag = keccak256(abi.encodePacked(sender, txHash)) +``` + +where `sender` is the address that called `requestWithdrawal` on the zone and `txHash` is the hash of that zone transaction. The `txHash` acts as a 32-byte blinding factor — it is private to the zone and known only to the sender and the sequencer. + +**On-chain construction** (`ZoneOutbox.sol`, `finalizeWithdrawalBatch`): + +```solidity +Withdrawal memory w = Withdrawal({ + token: pendingWithdrawal.token, + senderTag: keccak256( + abi.encodePacked(pendingWithdrawal.sender, pendingWithdrawal.txHash) + ), + to: pendingWithdrawal.to, + amount: pendingWithdrawal.amount, + fee: pendingWithdrawal.fee, + memo: pendingWithdrawal.memo, + gasLimit: pendingWithdrawal.gasLimit, + fallbackRecipient: pendingWithdrawal.fallbackRecipient, + callbackData: pendingWithdrawal.callbackData, + encryptedSender: encryptedSender +}); +``` + +The `txHash` is obtained from the `ZoneTxContext` precompile (`0x1c00...0005`) at withdrawal request time: + +```solidity +bytes32 txHash = IZoneTxContext(ZONE_TX_CONTEXT).currentTxHash(); +``` + +**Selective disclosure** (overview.md §"Selective disclosure"): + +- **Manual reveal**: sender reveals `txHash` off-chain. Verifier checks `keccak256(abi.encodePacked(sender, txHash)) == senderTag`. +- **Encrypted reveal**: if `revealTo` was specified, the holder of the `revealTo` private key decrypts `encryptedSender` to obtain `(sender, txHash)` and verifies against `senderTag`. + +--- + +## 3. Authenticated withdrawals — encrypted sender reveal + +### Security model + +**Functionality**: Enable automated sender disclosure for cross-zone transfers. The sequencer encrypts `(sender, txHash)` to a `revealTo` public key specified by the sender, so the holder of the corresponding private key can learn the sender's identity without off-chain coordination. + +**Trust assumptions**: +- The sequencer is trusted to encrypt correctly. A malicious sequencer could encrypt garbage or use a different key. This is acceptable since the sequencer already knows `sender` and `txHash` and could withhold them. +- The sender cannot perform the encryption themselves because `txHash` depends on the transaction contents (circular dependency). The sequencer encrypts post-hoc. +- Cross-zone scenario: if Zone B's sequencer holds the `revealTo` private key and is compromised, all sender identities for transfers to Zone B are exposed. + +**Threat surface**: +- The `encryptedSender` ciphertext is in L1 calldata (public). The ciphertext is fixed-length (113 bytes) to avoid length-based information leakage. +- The symmetric cipher and MAC used for the inner encryption are not fully specified in the overview document. The `ZoneOutbox.sol` defines the format but the KDF and cipher choice should be made explicit. + +### Spec extract + +**Withdrawal request** (`ZoneOutbox.sol`): + +The sender specifies an optional `revealTo` compressed secp256k1 public key (33 bytes) when calling `requestWithdrawal`. The outbox validates the key: + +```solidity +function _validateRevealTo(bytes memory revealTo) internal view { + if (revealTo.length == 0) return; + if (revealTo.length != REVEAL_TO_KEY_LENGTH) revert InvalidRevealTo(); // 33 bytes + bytes1 prefix = revealTo[0]; + if (prefix != 0x02 && prefix != 0x03) revert InvalidRevealTo(); + bytes32 x; + assembly { x := mload(add(revealTo, 33)) } + if (!_isValidSecp256k1X(x)) revert InvalidRevealTo(); +} +``` + +**Encrypted sender format** (`ZoneOutbox.sol`, overview.md §"Encrypted sender format"): + +When `revealTo` is specified, `encryptedSender` is exactly 113 bytes: + +``` +ephemeralPubKey (33 bytes) || nonce (12 bytes) || ciphertext (52 bytes) || tag (16 bytes) +``` + +The sequencer generates an ephemeral key pair `(r, R = r*G)`, derives a shared secret `S = r * revealTo` (ECDH), and encrypts `abi.encodePacked(sender, txHash)` (52 bytes). + +**Length validation** (`ZoneOutbox.sol`): + +```solidity +uint256 public constant AUTHENTICATED_WITHDRAWAL_CIPHERTEXT_LENGTH = 113; + +function _validateEncryptedSender(bytes memory revealTo, bytes memory encryptedSender) internal pure { + uint256 expectedLength = revealTo.length == 0 ? 0 : AUTHENTICATED_WITHDRAWAL_CIPHERTEXT_LENGTH; + if (encryptedSender.length != expectedLength) { + revert InvalidEncryptedSenderLength(encryptedSender.length, expectedLength); + } +} +``` + +**Zone-to-zone flow** (overview.md §"Zone-to-zone transfers"): + +1. Sender on Zone A calls `requestWithdrawal` with `revealTo = pubKeySeqB`. +2. Zone A's sequencer computes `senderTag` and `encryptedSender`. +3. Withdrawal is proven and submitted to L1. `processWithdrawal` transfers tokens to Zone B's portal. +4. Zone B's sequencer reads `encryptedSender`, decrypts with its private key to learn `(sender, txHash)`. +5. Zone B verifies `keccak256(sender || txHash) == senderTag`. + +--- + +## 4. RPC authorization tokens + +### Security model + +**Functionality**: Authenticate every RPC request to a zone, scoping all responses to the caller's account. Tokens are read-only credentials — no RPC method authenticated solely by a token may modify state (withdrawals require a full transaction signature). + +**Trust assumptions**: +- The token hash uses raw `keccak256` (not EIP-191/712) because P256 and WebAuthn signers cannot produce EIP-191 prefixed signatures. The `"TempoZoneRPC"` magic prefix must provide sufficient domain separation. +- Tokens are replayable within their validity window by design. The spec states this is acceptable because they are read-only credentials. Stolen tokens cannot move funds. +- Unscoped tokens (`zoneId = 0`) are valid for any zone on the network. Since tokens are read-only, this limits exposure to read access across zones. +- Keychain Access Keys use the zone's own `AccountKeychain` instance (not mirrored from Tempo L1). Revocation must be honored within 1 second of the revoking block being imported. + +**Threat surface**: +- A stolen token grants read access to the victim's account data (balances, transaction history, events) for up to 30 days. +- If the magic prefix collides with another signing context, a valid RPC token could be replayed as a different signed message, or vice versa. +- WebAuthn verification skips RP ID hash and origin validation. The challenge binding to `authorizationTokenHash` must be sufficient. + +### Spec extract + +**Token hash** (`rpc.md` §"Authorization tokens"): + +```solidity +bytes32 authorizationTokenHash = keccak256(abi.encodePacked( + bytes32(0x54656d706f5a6f6e65525043), // "TempoZoneRPC" magic prefix + uint8(version), // spec version (currently 0) + uint32(zoneId), // zone this key is valid for (0 = unscoped) + uint64(chainId), // zone chain ID (replay protection) + uint64(issuedAt), // unix timestamp (seconds) of issuance + uint64(expiresAt) // unix timestamp (seconds) of expiry +)); +``` + +**Signature types** (`rpc.md` §"Signature types"): + +| Type | Detection | Address derivation | +|------|-----------|-------------------| +| **secp256k1** | Exactly 65 bytes, no type prefix | `ecrecover` → address | +| **P256** | First byte `0x01`, 130 bytes total | Address from embedded pubkey | +| **WebAuthn** | First byte `0x02`, variable length (max 2KB) | Same as P256 | +| **Keychain** | First byte `0x03` (V1) or `0x04` (V2), variable length | Authenticated account is `user_address`, not signing key | + +**Transport wire format** (`rpc.md` §"Transport"): + +``` + +``` + +The token fields are always exactly 29 bytes. The server reads the last 29 bytes as token fields, everything before is the signature. Parsing from the end avoids ambiguity with variable-length signatures. + +**Validation rules** (`rpc.md` §"Validation"): + +- `zoneId` must match the zone's ID or be `0` (unscoped). +- `chainId` must match `eth_chainId`. +- `expiresAt - issuedAt > 2,592,000` (30 days max) → reject. +- `expiresAt <= now` → reject. +- `issuedAt > now + 60` (60-second clock skew tolerance) → reject. +- Keychain: signing key must be active, non-revoked, non-expired in `AccountKeychain`. + +**Keychain V2 signing hash** (`rpc.md` §"Keychain Access Keys"): + +V2 binds `user_address` into the signing hash: inner signature is over `keccak256(0x04 || authorizationTokenHash || user_address)`. V1 signs the raw `authorizationTokenHash` directly. + +**WebAuthn verification** (`rpc.md` §"WebAuthn"): + +Verified: authenticatorData length, UP/UV flags, AT flag NOT set, ED flag NOT set, `clientDataJSON.type == "webauthn.get"`, challenge matches `authorizationTokenHash` (Base64URL), P256 signature valid. + +Skipped: RP ID hash (no single relying party), `clientDataJSON.origin` (no canonical origin), signature counter (anti-cloning left to app layer). + +--- + +## Files to review + +| Area | Spec (documentation) | Solidity spec | +|------|---------------------|---------------| +| Encrypted deposits (ECIES + Chaum-Pedersen) | [overview.md](overview.md) §"Encrypted deposits", [prover-design.md](prover-design.md) | [IZone.sol](../../../specs/src/zone/IZone.sol), [ZoneInbox.sol](../../../specs/src/zone/ZoneInbox.sol), [EncryptedDeposit.sol](../../../specs/src/zone/EncryptedDeposit.sol) | +| Sender tag | [overview.md](overview.md) §"Authenticated withdrawals" | [IZone.sol](../../../specs/src/zone/IZone.sol) (`Withdrawal.senderTag`), [ZoneOutbox.sol](../../../specs/src/zone/ZoneOutbox.sol) | +| Encrypted sender | [overview.md](overview.md) §"Reveal key", §"Encrypted sender format" | [IZone.sol](../../../specs/src/zone/IZone.sol), [ZoneOutbox.sol](../../../specs/src/zone/ZoneOutbox.sol) | +| RPC auth tokens | [rpc.md](rpc.md) §"Authorization tokens" | — | +| Point validation | — | [ZonePortal.sol](../../../specs/src/zone/ZonePortal.sol) (`_isValidSecp256k1X`), [ZoneOutbox.sol](../../../specs/src/zone/ZoneOutbox.sol) (`_isValidSecp256k1X`) | +| Key rotation | [overview.md](overview.md) §"Encrypted deposits" | [ZonePortal.sol](../../../specs/src/zone/ZonePortal.sol) (`setSequencerEncryptionKey`, `isEncryptionKeyValid`) | diff --git a/docs/pages/protocol/privacy/execution.md b/docs/pages/protocol/privacy/execution.md index f7c1ed622..40e73cc1f 100644 --- a/docs/pages/protocol/privacy/execution.md +++ b/docs/pages/protocol/privacy/execution.md @@ -76,8 +76,8 @@ Authorization is **operation-specific**: ZoneInbox access applies to `mint` only **ZoneInbox mints** during deposit processing in `advanceTempo()`: - Regular deposit: `mint(deposit.to, deposit.amount)` — credits the recipient on the zone. -- Encrypted deposit (decryption succeeded): `mint(decrypted.to, deposit.amount)` — credits the decrypted recipient on the zone. -- Encrypted deposit (decryption failed): `mint(deposit.sender, deposit.amount)` — credits the depositor's address on the zone (same address as their L1 account). The L1 funds remain escrowed in the portal. +- Encrypted deposit (decryption succeeded): `mint(decrypted.to, deposit.amount)` — credits the decrypted recipient on the zone. If the mint fails (e.g. recipient is blacklisted by TIP-403 policy), falls back to crediting the depositor. +- Encrypted deposit (decryption failed or mint rejected): `mint(deposit.sender, deposit.amount)` — credits the depositor's address on the zone (same address as their L1 account). The L1 funds remain escrowed in the portal. **ZoneOutbox burns** during withdrawal requests in `requestWithdrawal()`: diff --git a/docs/pages/protocol/privacy/overview.md b/docs/pages/protocol/privacy/overview.md index 6f31023c9..7edf1e3fc 100644 --- a/docs/pages/protocol/privacy/overview.md +++ b/docs/pages/protocol/privacy/overview.md @@ -1230,18 +1230,18 @@ This ensures deposits are processed in the exact order they were made, regardles **On-chain decryption verification:** -The zone can verify encrypted deposit decryption on-chain without the sequencer revealing their private key. The sequencer provides the ECDH shared secret alongside the decrypted data: +The zone can verify encrypted deposit decryption on-chain without the sequencer revealing their private key. The sequencer provides the ECDH shared secret and a proof of correct derivation: ```solidity struct DecryptionData { bytes32 sharedSecret; // ECDH shared secret (x-coordinate of privSeq * ephemeralPub) uint8 sharedSecretYParity; // Y coordinate parity of the shared secret point (0x02 or 0x03) - address to; // Decrypted recipient - bytes32 memo; // Decrypted memo ChaumPedersenProof cpProof; // Proof of correct shared secret derivation } ``` +The decrypted `(to, memo)` are derived on-chain from the AES-GCM decryption of the ciphertext and do not need to be supplied by the sequencer. + Verification works by leveraging the AES-GCM authentication tag: 1. Sequencer computes: `sharedSecret = ECDH(sequencerPriv, ephemeralPub)` @@ -1387,11 +1387,12 @@ bytes32 aesKey = _hkdfSha256( ed.encrypted.tag ); -// Step 5: Verify decrypted plaintext matches claimed (to, memo) +// Step 5: Decode the decrypted (to, memo) from the plaintext // Plaintext is packed as [address(20 bytes)][memo(32 bytes)][padding(12 bytes)] = 64 bytes +address decryptedTo; +bytes32 decryptedMemo; if (valid && decryptedPlaintext.length == ENCRYPTED_PAYLOAD_PLAINTEXT_SIZE) { - (address decryptedTo, bytes32 decryptedMemo) = EncryptedDepositLib.decodePlaintext(decryptedPlaintext); - valid = (decryptedTo == dec.to && decryptedMemo == dec.memo); + (decryptedTo, decryptedMemo) = EncryptedDepositLib.decodePlaintext(decryptedPlaintext); } else { valid = false; } @@ -1402,16 +1403,22 @@ if (!valid) { IZoneToken(ed.token).mint(ed.sender, ed.amount); emit EncryptedDepositFailed(currentHash, ed.sender, ed.token, ed.amount); } else { - // Decryption succeeded - mint correct zone-side TIP-20 to decrypted recipient - IZoneToken(ed.token).mint(dec.to, ed.amount); - emit EncryptedDepositProcessed(currentHash, ed.sender, dec.to, ed.token, ed.amount, dec.memo); + // Decryption succeeded — try minting to the decrypted recipient. + // If the mint fails (e.g. recipient is blacklisted by TIP-403 policy), + // fall back to crediting the depositor instead. + try IZoneToken(ed.token).mint(decryptedTo, ed.amount) { + emit EncryptedDepositProcessed(currentHash, ed.sender, decryptedTo, ed.token, ed.amount, decryptedMemo); + } catch { + IZoneToken(ed.token).mint(ed.sender, ed.amount); + emit EncryptedDepositFailed(currentHash, ed.sender, ed.token, ed.amount); + } } ``` **Key properties:** - **Zero-knowledge security**: Chaum-Pedersen proof verifies shared secret without exposing sequencer's private key to EVM - **Griefing resistance**: Invalid encryptions can be detected and rejected, preventing chain blockage -- **Graceful failure**: Invalid encrypted deposits return funds to sender instead of reverting +- **Graceful failure**: Invalid encrypted deposits or policy-rejected mints return funds to sender instead of reverting - **Cryptographic proof**: GCM tag validation proves decryption correctness - **On-chain verification**: All verification happens on-chain via precompiles - **Standard crypto**: Uses well-established ECIES, ECDH, Chaum-Pedersen, HKDF-SHA256, and AES-256-GCM diff --git a/docs/pages/protocol/privacy/prover-design.md b/docs/pages/protocol/privacy/prover-design.md index 08a79dbe3..0ad0d88b1 100644 --- a/docs/pages/protocol/privacy/prover-design.md +++ b/docs/pages/protocol/privacy/prover-design.md @@ -160,11 +160,10 @@ pub enum DepositType { } /// Mirrors the Solidity `DecryptionData` struct from IZone.sol -/// Provided by the sequencer for each encrypted deposit +/// Provided by the sequencer for each encrypted deposit. +/// The decrypted (to, memo) are derived on-chain from AES-GCM decryption. pub struct DecryptionData { pub shared_secret: B256, // ECDH shared secret (x-coordinate) - pub to: Address, // Decrypted recipient - pub memo: B256, // Decrypted memo pub cp_proof: ChaumPedersenProof, // Proof of correct shared secret derivation } diff --git a/docs/specs/src/zone/IZone.sol b/docs/specs/src/zone/IZone.sol index 5586bbaaa..b6e9a50b8 100644 --- a/docs/specs/src/zone/IZone.sol +++ b/docs/specs/src/zone/IZone.sol @@ -137,11 +137,11 @@ struct ChaumPedersenProof { /// without exposing the sequencer's private key. /// The sequencer's public key is looked up from the deposit's keyIndex on-chain, /// so it does not need to be included here. +/// The decrypted (to, memo) are derived on-chain from the AES-GCM decryption and +/// do not need to be supplied by the sequencer. struct DecryptionData { bytes32 sharedSecret; // ECDH shared secret (x-coordinate of privSeq * ephemeralPub) uint8 sharedSecretYParity; // Y coordinate parity of the shared secret point (0x02 or 0x03) - address to; // Decrypted recipient - bytes32 memo; // Decrypted memo ChaumPedersenProof cpProof; // Proof of correct shared secret derivation } diff --git a/docs/specs/src/zone/ZoneInbox.sol b/docs/specs/src/zone/ZoneInbox.sol index 98839f85f..b4783bdef 100644 --- a/docs/specs/src/zone/ZoneInbox.sol +++ b/docs/specs/src/zone/ZoneInbox.sol @@ -257,13 +257,14 @@ contract ZoneInbox is IZoneInbox { ed.encrypted.tag ); - // Step 4: Verify decrypted plaintext matches claimed (to, memo) + // Step 4: Decode the decrypted (to, memo) from the plaintext // Plaintext is packed as [address(20 bytes)][memo(32 bytes)][padding(12 bytes)] // Must be exactly ENCRYPTED_PAYLOAD_PLAINTEXT_SIZE (64) bytes + address decryptedTo; + bytes32 decryptedMemo; if (valid && decryptedPlaintext.length == ENCRYPTED_PAYLOAD_PLAINTEXT_SIZE) { - (address decryptedTo, bytes32 decryptedMemo) = + (decryptedTo, decryptedMemo) = EncryptedDepositLib.decodePlaintext(decryptedPlaintext); - valid = (decryptedTo == dec.to && decryptedMemo == dec.memo); } else { valid = false; } @@ -277,11 +278,17 @@ contract ZoneInbox is IZoneInbox { IZoneToken(ed.token).mint(ed.sender, ed.amount); emit EncryptedDepositFailed(currentHash, ed.sender, ed.token, ed.amount); } else { - // Decryption succeeded - mint the correct zone-side TIP-20 to the decrypted recipient - IZoneToken(ed.token).mint(dec.to, ed.amount); - emit EncryptedDepositProcessed( - currentHash, ed.sender, dec.to, ed.token, ed.amount, dec.memo - ); + // Decryption succeeded — try minting to the decrypted recipient. + // If the mint fails (e.g. recipient is blacklisted by TIP-403 + // policy), fall back to crediting the depositor instead. + try IZoneToken(ed.token).mint(decryptedTo, ed.amount) { + emit EncryptedDepositProcessed( + currentHash, ed.sender, decryptedTo, ed.token, ed.amount, decryptedMemo + ); + } catch { + IZoneToken(ed.token).mint(ed.sender, ed.amount); + emit EncryptedDepositFailed(currentHash, ed.sender, ed.token, ed.amount); + } } } } diff --git a/docs/specs/test/zone/ZoneBridge.t.sol b/docs/specs/test/zone/ZoneBridge.t.sol index 7fe5506ff..7e7671345 100644 --- a/docs/specs/test/zone/ZoneBridge.t.sol +++ b/docs/specs/test/zone/ZoneBridge.t.sol @@ -964,8 +964,6 @@ contract ZoneBridgeTest is BaseTest { decs[i] = DecryptionData({ sharedSecret: bytes32(uint256(0xDEAD)), sharedSecretYParity: 0x02, - to: decryptedTo, - memo: decryptedMemo, cpProof: ChaumPedersenProof({ s: bytes32(uint256(1)), c: bytes32(uint256(2)) }) }); } @@ -1087,7 +1085,7 @@ contract ZoneBridgeTest is BaseTest { _sequencerObserveEncryptedDeposit(alice, netAmount, 0, payload); _setupEncryptionKeyMockOnZone(0, encKeyX, encKeyYParity); - // Even with shouldSucceed=false, we need a to/memo for DecryptionData (values don't matter) + // Even with shouldSucceed=false, we still call the relay helper bytes32 newProcessedHash = _sequencerRelayEncryptedDepositsToL2(address(0xBEEF), bytes32("wrong"), false); @@ -1193,8 +1191,6 @@ contract ZoneBridgeTest is BaseTest { decs[0] = DecryptionData({ sharedSecret: bytes32(uint256(0xDEAD)), sharedSecretYParity: 0x02, - to: decryptedTo, - memo: decryptedMemo, cpProof: ChaumPedersenProof({ s: bytes32(uint256(1)), c: bytes32(uint256(2)) }) }); @@ -1306,15 +1302,11 @@ contract ZoneBridgeTest is BaseTest { decs[0] = DecryptionData({ sharedSecret: bytes32(uint256(0xDEAD)), sharedSecretYParity: 0x02, - to: aliceRecipient, - memo: aliceMemo, cpProof: ChaumPedersenProof({ s: bytes32(uint256(1)), c: bytes32(uint256(2)) }) }); decs[1] = DecryptionData({ sharedSecret: bytes32(uint256(0xBEEF)), sharedSecretYParity: 0x02, - to: bobRecipient, - memo: bobMemo, cpProof: ChaumPedersenProof({ s: bytes32(uint256(3)), c: bytes32(uint256(4)) }) }); @@ -1326,30 +1318,11 @@ contract ZoneBridgeTest is BaseTest { address(l1Portal), PORTAL_CURRENT_DEPOSIT_QUEUE_HASH_SLOT, hash2 ); - // Mock precompiles — we use broad mocks since vm.mockCall matches any input - // For the success path, we need AES-GCM to return the correct plaintext. - // Since vm.mockCall with just the selector matches ALL calls, we mock for the LAST - // decryption (bobRecipient). For aliceRecipient we set up mock before advanceTempo, - // but vm.mockCall replaces: we need a workaround. - // - // Since Foundry's vm.mockCall uses last-registered-wins for the same address+selector, - // and encrypted deposits are processed sequentially, we can't differentiate two calls - // to the same precompile with different expected outputs using selector-only mocking. - // - // Workaround: mock both precompiles to return bobRecipient's plaintext. - // Alice's deposit will fail the plaintext check (dec.to != decryptedTo), causing a bounce. - // We test a simpler scenario: mock for aliceRecipient so BOTH succeed with the same plaintext. - // - // Actually, the cleanest approach: make both deposits decrypt to the same recipient/memo. - // This tests key rotation without needing differentiated mocks. - - // Use same recipient/memo for both decryptions + // Mock precompiles to return the same plaintext for both deposits. + // Since vm.mockCall with just the selector matches ALL calls, both encrypted + // deposits will decrypt to the same (sharedRecipient, sharedMemo). address sharedRecipient = address(0x700); bytes32 sharedMemo = bytes32("shared-secret"); - decs[0].to = sharedRecipient; - decs[0].memo = sharedMemo; - decs[1].to = sharedRecipient; - decs[1].memo = sharedMemo; vm.etch(CHAUM_PEDERSEN_VERIFY, hex"00"); vm.etch(AES_GCM_DECRYPT, hex"00"); diff --git a/docs/specs/test/zone/ZoneInbox.t.sol b/docs/specs/test/zone/ZoneInbox.t.sol index 91a7da53e..178bb3491 100644 --- a/docs/specs/test/zone/ZoneInbox.t.sol +++ b/docs/specs/test/zone/ZoneInbox.t.sol @@ -494,8 +494,6 @@ contract ZoneInboxTest is Test { decs[0] = DecryptionData({ sharedSecret: bytes32(uint256(0xdeadbeef)), sharedSecretYParity: 0x02, - to: recipient, - memo: memo, cpProof: ChaumPedersenProof({ s: bytes32(uint256(1)), c: bytes32(uint256(2)) }) }); @@ -547,8 +545,6 @@ contract ZoneInboxTest is Test { decs[0] = DecryptionData({ sharedSecret: bytes32(uint256(0xdeadbeef)), sharedSecretYParity: 0x02, - to: address(0x500), - memo: bytes32("memo"), cpProof: ChaumPedersenProof({ s: bytes32(uint256(1)), c: bytes32(uint256(2)) }) }); @@ -594,8 +590,6 @@ contract ZoneInboxTest is Test { decs[0] = DecryptionData({ sharedSecret: bytes32(uint256(0xabcd)), sharedSecretYParity: 0x02, - to: recipient, - memo: encMemo, cpProof: ChaumPedersenProof({ s: bytes32(uint256(1)), c: bytes32(uint256(2)) }) }); @@ -652,8 +646,6 @@ contract ZoneInboxTest is Test { decs[0] = DecryptionData({ sharedSecret: bytes32(uint256(1)), sharedSecretYParity: 0x02, - to: address(0x500), - memo: bytes32("memo"), cpProof: ChaumPedersenProof({ s: bytes32(uint256(1)), c: bytes32(uint256(2)) }) }); @@ -780,8 +772,6 @@ contract ZoneInboxTest is Test { decs[0] = DecryptionData({ sharedSecret: bytes32(uint256(0xbad)), sharedSecretYParity: 0x02, - to: address(0x500), - memo: bytes32("memo"), cpProof: ChaumPedersenProof({ s: bytes32(uint256(1)), c: bytes32(uint256(2)) }) }); @@ -797,9 +787,7 @@ contract ZoneInboxTest is Test { /// @notice Helper: set up an encrypted deposit flow where AES-GCM returns a specific plaintext function _setupEncryptedDepositWithPlaintext( bytes memory mockPlaintext, - bool aesValid, - address recipient, - bytes32 memo + bool aesValid ) internal returns (QueuedDeposit[] memory deposits, DecryptionData[] memory decs) @@ -843,8 +831,6 @@ contract ZoneInboxTest is Test { decs[0] = DecryptionData({ sharedSecret: bytes32(uint256(0xdeadbeef)), sharedSecretYParity: 0x02, - to: recipient, - memo: memo, cpProof: ChaumPedersenProof({ s: bytes32(uint256(1)), c: bytes32(uint256(2)) }) }); } @@ -864,7 +850,7 @@ contract ZoneInboxTest is Test { } (QueuedDeposit[] memory deposits, DecryptionData[] memory decs) = - _setupEncryptedDepositWithPlaintext(shortPlaintext, true, recipient, memo); + _setupEncryptedDepositWithPlaintext(shortPlaintext, true); vm.prank(sequencer); inbox.advanceTempo("", deposits, decs, new EnabledToken[](0)); @@ -887,7 +873,7 @@ contract ZoneInboxTest is Test { } (QueuedDeposit[] memory deposits, DecryptionData[] memory decs) = - _setupEncryptedDepositWithPlaintext(longPlaintext, true, recipient, memo); + _setupEncryptedDepositWithPlaintext(longPlaintext, true); vm.prank(sequencer); inbox.advanceTempo("", deposits, decs, new EnabledToken[](0)); @@ -905,7 +891,7 @@ contract ZoneInboxTest is Test { bytes memory emptyPlaintext = new bytes(0); (QueuedDeposit[] memory deposits, DecryptionData[] memory decs) = - _setupEncryptedDepositWithPlaintext(emptyPlaintext, true, recipient, memo); + _setupEncryptedDepositWithPlaintext(emptyPlaintext, true); vm.prank(sequencer); inbox.advanceTempo("", deposits, decs, new EnabledToken[](0)); @@ -924,7 +910,7 @@ contract ZoneInboxTest is Test { bytes memory correctPlaintext = EncryptedDepositLib.encodePlaintext(recipient, memo); (QueuedDeposit[] memory deposits, DecryptionData[] memory decs) = - _setupEncryptedDepositWithPlaintext(correctPlaintext, true, recipient, memo); + _setupEncryptedDepositWithPlaintext(correctPlaintext, true); vm.prank(sequencer); inbox.advanceTempo("", deposits, decs, new EnabledToken[](0)); From 814556577bb401d662c2ffada22214ad3356056f Mon Sep 17 00:00:00 2001 From: Dankrad Feist Date: Mon, 20 Apr 2026 18:40:59 +0300 Subject: [PATCH 2/2] test: regenerate zone-test-genesis with Address::ZERO tempo_portal The integration tests' start_from_l1() patches the ZoneInbox/ZoneConfig bytecode at test setup by replacing Address::ZERO with the real L1 portal address. The previous regeneration baked 0xbb..bb as the placeholder, causing `expected 4 tempoPortal immutable(s) ... found 0` assertion failures in all start_from_l1 integration tests. Regenerated with --tempo-portal 0x0000...0000 to match main's convention. Made-with: Cursor --- crates/tempo-zone/tests/assets/zone-test-genesis.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/tempo-zone/tests/assets/zone-test-genesis.json b/crates/tempo-zone/tests/assets/zone-test-genesis.json index 255b21520..8f42a913f 100644 --- a/crates/tempo-zone/tests/assets/zone-test-genesis.json +++ b/crates/tempo-zone/tests/assets/zone-test-genesis.json @@ -58,7 +58,7 @@ "0x1c00000000000000000000000000000000000001": { "nonce": "0x1", "balance": "0x0", - "code": "0x60806040526004361015610011575f80fd5b5f3560e01c80631fbb25ad146100745780632d4884821461006f57806379502c551461006a57806382648c3b1461006557806397cac0fb146100605763a21de6d91461005b575f80fd5b61026c565b6101ac565b610130565b6100ec565b6100c6565b346100b8575f3660031901126100b8577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03166080908152602090f35b5f80fd5b5f9103126100b857565b346100b8575f3660031901126100b85760206001600160401b0360015416604051908152f35b346100b8575f3660031901126100b8576040517f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03168152602090f35b346100b8575f3660031901126100b85760205f54604051908152f35b9181601f840112156100b8578235916001600160401b0383116100b8576020808501948460051b0101116100b857565b9181601f840112156100b8578235916001600160401b0383116100b8576020808501948460071b0101116100b857565b346100b85760803660031901126100b8576004356001600160401b0381116100b857366023820112156100b8578060040135906001600160401b0382116100b85736602483830101116100b8576024356001600160401b0381116100b85761021890369060040161014c565b6044929192356001600160401b0381116100b85761023a90369060040161017c565b91606435946001600160401b0386116100b85761026a96610261602497369060040161014c565b979096016109d1565b005b346100b8575f3660031901126100b8576040517f000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb6001600160a01b03168152602090f35b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b038211176102df57604052565b6102b0565b90601f801991011681019081106001600160401b038211176102df57604052565b6001600160a01b038116036100b857565b908160209103126100b8575161032b81610305565b90565b6040513d5f823e3d90fd5b908060209392818452848401375f828201840152601f01601f1916010190565b91602061032b938181520191610339565b634e487b7160e01b5f52603260045260245ffd5b91908110156103a05760051b81013590607e19813603018212156100b8570190565b61036a565b3561032b81610305565b903590601e19813603018212156100b857018035906001600160401b0382116100b8576020019181360383136100b857565b95939161040d9061041b9461032b99979360018060a01b03168952608060208a01526080890191610339565b918683036040880152610339565b926060818503910152610339565b9492909361044761032b979561045594606089526060890191610339565b918683036020880152610339565b926040818503910152610339565b91908110156103a05760051b81013590603e19813603018212156100b8570190565b6002111561048f57565b634e487b7160e01b5f52602160045260245ffd5b3560028110156100b85790565b35906001600160801b03821682036100b857565b60ff8116036100b857565b6001600160401b0381116102df57601f01601f191660200190565b35906001600160a01b0319821682036100b857565b35906001600160801b0319821682036100b857565b919060a0838203126100b8576040519061052d826102c4565b8193803583526020810135610541816104c4565b602084015260408101356001600160401b0381116100b857810182601f820112156100b857803591610572836104cf565b9361058060405195866102e4565b838552602084840101116100b8576080935f6020856105c19682899701838601378301015260408601526105b6606082016104ea565b6060860152016104ff565b910152565b6020818303126100b8578035906001600160401b0382116100b8570160a0818303126100b857604051916105f9836102c4565b813561060481610305565b8352602082013561061481610305565b6020840152610625604083016104b0565b60408401526060820135606084015260808201356001600160401b0381116100b8576106519201610514565b608082015290565b634e487b7160e01b5f52601160045260245ffd5b5f19811461067b5760010190565b610659565b91908110156103a05760071b0190565b3561032b816104c4565b519081151582036100b857565b908160209103126100b85761032b9061069a565b604051906106ca6040836102e4565b600d82526c65636965732d6165732d6b657960981b6020830152565b91906040838203126100b85782516001600160401b0381116100b857830181601f820112156100b85780519161071b836104cf565b9061072960405192836102e4565b838252602084840101116100b8575f60208461032b95828096018386015e83010152930161069a565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b926107ac9060809360209397969786526bffffffffffffffffffffffff60a01b168386015260a0604086015260a0850190610752565b83810360608501525f815201936001600160801b031916910152565b90600282101561048f5752565b92919060806040916107e88660016107c8565b6060602087015260018060a01b03815116606087015260018060a01b03602082015116828701526001600160801b03838201511660a0870152606081015160c0870152015160a060e0860152805161010086015260ff6020820151166101208601526108648282015160a06101408801526101a0870190610752565b60608201516001600160a01b0319166101608701526080909101516001600160801b031916610180860152930152565b6001600160a01b0390911681526001600160801b03909116602082015260400190565b908160a09103126100b8576080604051916108d1836102c4565b80356108dc81610305565b835260208101356108ec81610305565b602084015260408101356108ff81610305565b6040840152610910606082016104b0565b60608401520135608082015290565b60c09093929193608060e0820195610937835f6107c8565b80516001600160a01b039081166020858101919091528201518116604080860191909152820151166060808501919091528101516001600160801b031682840152015160a08201520152565b908160209103126100b8575190565b906001600160401b03809116911601906001600160401b03821161067b57565b908160209103126100b857516001600160401b03811681036100b85790565b9591949392969033151580611482575b611473577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b031696873b156100b85760405163fe77009960e01b8152915f9183918291610a39919060048401610359565b0381838b5af18015610c015761145f575b505f9492945b818110611344575050505f54925f915f915b878310610c675750505003610c58576040516381e3da6b60e01b81527f000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb6001600160a01b03166004808301919091526024820152602081604481865afa8015610c0157610c3b575b50805f55610b11610af56001600160401b038516610af06001546001600160401b031690565b610992565b6001600160401b03166001600160401b03196001541617600155565b604051631014997960e31b815291602083600481845afa928315610c01575f93610c06575b50602060049160405192838092631d04645f60e01b82525afa8015610c01577fd2d2bf1e295f62cd08f0f0ab45818efeaba78b58310526f7b7e9686b8aeded1a926001600160401b03925f92610bcc575b50610bc790610b9e6001546001600160401b031690565b6040805198895260208901929092526001600160401b0316908701529116939081906060820190565b0390a3565b610bc7919250610bf39060203d602011610bfa575b610beb81836102e4565b8101906109b2565b9190610b87565b503d610be1565b61032e565b6004919350610c2c602091823d8411610c34575b610c2481836102e4565b810190610983565b939150610b36565b503d610c1a565b610c539060203d602011610c3457610c2481836102e4565b610aca565b6361aba18160e11b5f5260045ffd5b909194610c75868985610463565b610c7e816104a3565b610c8781610485565b610e2857610c9c816020610ca49301906103af565b8101906108b7565b90604051610cc981610cbb6020820194868661091f565b03601f1981018352826102e4565b5190208151909690610cf190610ce5906001600160a01b031681565b6001600160a01b031690565b6040830180519091906001600160a01b0316906060850191610d1a83516001600160801b031690565b823b156100b857610d44925f92836040518096819582946340c10f1960e01b845260048401610894565b03925af18015610c01576001958b927fd5277bc9597c7da3fab9cdbba4de6005f48b9eb7389cf2389c4ea9eea3172c2192610e0e575b506020810151610d9b906001600160a01b031695516001600160a01b031690565b8151610e0290608090610dbf906001600160a01b031697516001600160801b031690565b930151604080516001600160a01b0390981688526001600160801b0390941660208801529286019290925260a088901b8890039081169516939081906060820190565b0390a45b019190610a62565b80610e1c5f610e22936102e4565b806100bc565b5f610d7a565b610e3c816020610e449399949901906103af565b8101906105c6565b908585101561133557610ef696610e65610e5d8761066d565b968886610680565b6060840160406020610e778351611542565b929094608089019d8e51610e9085825192015160ff1690565b95833598610e9f878601610690565b8651635f8a996960e01b8152600481019490945260ff9889166024850152604484018b905288166064840152608483015290951660a48601529101803560c48501526020013560e484015282908190610104820190565b0381731c000000000000000000000000000000000001005afa908115610c01575f91611307575b50156112f857518951516040516bffffffffffffffffffffffff197f000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb60601b166020820152603481019290925260548083019190915281525f91610f959190610f876074836102e4565b610f8f6106bb565b906116b3565b98518099610fed610fd260806040610fbf60608701516bffffffffffffffffffffffff60a01b1690565b9501519d01516001600160801b03191690565b60405163f4a7eb1360e01b81529c8d94859460048601610776565b0381731c000000000000000000000000000000000001015afa978815610c01575f905f996112d1575b505f808a806112c6575b156112ba5750506110309061171f565b90915b60405161104981610cbb602082019489866107d5565b5190209861115b575050815161106990610ce5906001600160a01b031681565b602083018051909391906001600160a01b031691604081019261109384516001600160801b031690565b833b156100b8576110bd935f92836040518097819582946340c10f1960e01b845260048401610894565b03925af1908115610c015761112761111961110b6001988e967f95705d99ac13cf82894fd274cd871942e6f301c98c186271337e8fedbbb9d7ea96611147575b50516001600160a01b031690565b92516001600160a01b031690565b94516001600160801b031690565b9061113f604051928392898060a01b03169683610894565b0390a3610e06565b80610e1c5f611155936102e4565b5f6110fd565b835161117190610ce5906001600160a01b031681565b90604085019261118884516001600160801b031690565b833b156100b8575f6111b48d9582936040519485809481936340c10f1960e01b83528960048401610894565b03925af190816112a6575b506111ff57505083516111dd9150610ce5906001600160a01b031681565b6020840180519094906001600160a01b031683516001600160801b0316611093565b859392917ffc236d1b4402e76c2b0a882db36ad3a6fb0f5b6b7edc8ae317d993f10434c4369161129e61125f611251611243602060019c015160018060a01b031690565b98516001600160a01b031690565b96516001600160801b031690565b604080516001600160a01b0390981688526001600160801b03909116602088015286019290925260a088901b8890039081169516939081906060820190565b0390a4610e06565b80610e1c5f6112b4936102e4565b5f6111bf565b91509198505f98611033565b506040835114611020565b90506112f09198503d805f833e6112e881836102e4565b8101906106e6565b97905f611016565b63fb1f4a4960e01b5f5260045ffd5b611328915060203d811161132e575b61132081836102e4565b8101906106a7565b5f610f1d565b503d611316565b6351de8c1f60e01b5f5260045ffd5b61135281838598969861037e565b9061135c826103a5565b91602081019061136c82826103af565b9092604083019361137d85856103af565b919097606086019861138f8a886103af565b9061083f60921b3b156100b8575f956113bd93604051998a9788976374ae5b3760e11b8952600489016103e1565b03818361083f60921b5af18015610c01576001967f4ac4dcc08b0c26c3fb6b58c64c1392b7934b1ce6b0382a5986ea5c3de795e053946114209461143f9361144b575b50611428611417611410836103a5565b95836103af565b969098836103af565b9390926103af565b9290916040519687968c8060a01b03169987610429565b0390a201949294610a50565b80610e1c5f611459936102e4565b5f611400565b80610e1c5f61146d936102e4565b5f610a4a565b63bb62587160e01b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa908115610c01575f916114e2575b506001600160a01b03163314156109e1565b611504915060203d60201161150a575b6114fc81836102e4565b810190610316565b5f6114d0565b503d6114f2565b908160011b918083046002149015171561067b57565b906001820180921161067b57565b9190820180921161067b57565b6115739061156d604051602081019061156481610cbb84906006602083019252565b51902091611511565b90611535565b906115fc61158083611527565b6040516381e3da6b60e01b81526001600160a01b037f000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb818116600484015260248301969096527f0000000000000000000000001c0000000000000000000000000000000000000016949092909190602090849081906044820190565b0381885afa928315610c01575f93611680575b5082156112f8576040516381e3da6b60e01b81526001600160a01b03929092166004830152602482015292602090849060449082905afa928315610c01575f9361165c575b509160ff1690565b60ff9193506116799060203d602011610c3457610c2481836102e4565b9290611654565b61169a91935060203d602011610c3457610c2481836102e4565b915f61160f565b805191908290602001825e015f815290565b9161170760016116e161032b956116f295604051916020830152602082526116dc6040836102e4565b611768565b9260405194859160208301906116a1565b8260f81b815203601e198101855201836102e4565b604051906020820152602081526116dc6040826102e4565b9081516040810361173b57506034602083015160601c92015190565b633fbbeba160e21b5f52600452604060245260445ffd5b61032b93926040928252602082015201906116a1565b5f908051604081115f1461187457505f61178a602092604051918280926116a1565b039060025afa15610c015760205f611805610cbb6117f98351965b6040519283917f363636363636363636363636363636363636363636363636363636363636363689187f36363636363636363636363636363636363636363636363636363636363636368b18898501611752565b604051918280926116a1565b039060025afa15610c01576118647f5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c6117f95f93610cbb6020968651908560405196879518911889850191606093918352602083015260408201520190565b039060025afa15610c01575f5190565b60208083015194908211935091600184146118e357505f925b602082106118cd575b60408210166118b3575b505f611805610cbb6117f96020946117a5565b600160409190910360031b1b5f190119909116905f6118a0565b935f1960018360200360031b1b01191693611896565b604001519261188d56fea26469706673582212208e93ef9bfe51376039a34783438753d575cafb9c32630db748d87afe43a51c4a64736f6c634300081e0033" + "code": "0x60806040526004361015610011575f80fd5b5f3560e01c80631fbb25ad146100745780632d4884821461006f57806379502c551461006a57806382648c3b1461006557806397cac0fb146100605763a21de6d91461005b575f80fd5b61026c565b6101ac565b610130565b6100ec565b6100c6565b346100b8575f3660031901126100b8577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03166080908152602090f35b5f80fd5b5f9103126100b857565b346100b8575f3660031901126100b85760206001600160401b0360015416604051908152f35b346100b8575f3660031901126100b8576040517f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03168152602090f35b346100b8575f3660031901126100b85760205f54604051908152f35b9181601f840112156100b8578235916001600160401b0383116100b8576020808501948460051b0101116100b857565b9181601f840112156100b8578235916001600160401b0383116100b8576020808501948460071b0101116100b857565b346100b85760803660031901126100b8576004356001600160401b0381116100b857366023820112156100b8578060040135906001600160401b0382116100b85736602483830101116100b8576024356001600160401b0381116100b85761021890369060040161014c565b6044929192356001600160401b0381116100b85761023a90369060040161017c565b91606435946001600160401b0386116100b85761026a96610261602497369060040161014c565b979096016109d1565b005b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b038211176102df57604052565b6102b0565b90601f801991011681019081106001600160401b038211176102df57604052565b6001600160a01b038116036100b857565b908160209103126100b8575161032b81610305565b90565b6040513d5f823e3d90fd5b908060209392818452848401375f828201840152601f01601f1916010190565b91602061032b938181520191610339565b634e487b7160e01b5f52603260045260245ffd5b91908110156103a05760051b81013590607e19813603018212156100b8570190565b61036a565b3561032b81610305565b903590601e19813603018212156100b857018035906001600160401b0382116100b8576020019181360383136100b857565b95939161040d9061041b9461032b99979360018060a01b03168952608060208a01526080890191610339565b918683036040880152610339565b926060818503910152610339565b9492909361044761032b979561045594606089526060890191610339565b918683036020880152610339565b926040818503910152610339565b91908110156103a05760051b81013590603e19813603018212156100b8570190565b6002111561048f57565b634e487b7160e01b5f52602160045260245ffd5b3560028110156100b85790565b35906001600160801b03821682036100b857565b60ff8116036100b857565b6001600160401b0381116102df57601f01601f191660200190565b35906001600160a01b0319821682036100b857565b35906001600160801b0319821682036100b857565b919060a0838203126100b8576040519061052d826102c4565b8193803583526020810135610541816104c4565b602084015260408101356001600160401b0381116100b857810182601f820112156100b857803591610572836104cf565b9361058060405195866102e4565b838552602084840101116100b8576080935f6020856105c19682899701838601378301015260408601526105b6606082016104ea565b6060860152016104ff565b910152565b6020818303126100b8578035906001600160401b0382116100b8570160a0818303126100b857604051916105f9836102c4565b813561060481610305565b8352602082013561061481610305565b6020840152610625604083016104b0565b60408401526060820135606084015260808201356001600160401b0381116100b8576106519201610514565b608082015290565b634e487b7160e01b5f52601160045260245ffd5b5f19811461067b5760010190565b610659565b91908110156103a05760071b0190565b3561032b816104c4565b519081151582036100b857565b908160209103126100b85761032b9061069a565b604051906106ca6040836102e4565b600d82526c65636965732d6165732d6b657960981b6020830152565b91906040838203126100b85782516001600160401b0381116100b857830181601f820112156100b85780519161071b836104cf565b9061072960405192836102e4565b838252602084840101116100b8575f60208461032b95828096018386015e83010152930161069a565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b926107ac9060809360209397969786526bffffffffffffffffffffffff60a01b168386015260a0604086015260a0850190610752565b83810360608501525f815201936001600160801b031916910152565b90600282101561048f5752565b92919060806040916107e88660016107c8565b6060602087015260018060a01b03815116606087015260018060a01b03602082015116828701526001600160801b03838201511660a0870152606081015160c0870152015160a060e0860152805161010086015260ff6020820151166101208601526108648282015160a06101408801526101a0870190610752565b60608201516001600160a01b0319166101608701526080909101516001600160801b031916610180860152930152565b6001600160a01b0390911681526001600160801b03909116602082015260400190565b908160a09103126100b8576080604051916108d1836102c4565b80356108dc81610305565b835260208101356108ec81610305565b602084015260408101356108ff81610305565b6040840152610910606082016104b0565b60608401520135608082015290565b60c09093929193608060e0820195610937835f6107c8565b80516001600160a01b039081166020858101919091528201518116604080860191909152820151166060808501919091528101516001600160801b031682840152015160a08201520152565b908160209103126100b8575190565b906001600160401b03809116911601906001600160401b03821161067b57565b908160209103126100b857516001600160401b03811681036100b85790565b9591949392969033151580611482575b611473577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b031696873b156100b85760405163fe77009960e01b8152915f9183918291610a39919060048401610359565b0381838b5af18015610c015761145f575b505f9492945b818110611344575050505f54925f915f915b878310610c675750505003610c58576040516381e3da6b60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166004808301919091526024820152602081604481865afa8015610c0157610c3b575b50805f55610b11610af56001600160401b038516610af06001546001600160401b031690565b610992565b6001600160401b03166001600160401b03196001541617600155565b604051631014997960e31b815291602083600481845afa928315610c01575f93610c06575b50602060049160405192838092631d04645f60e01b82525afa8015610c01577fd2d2bf1e295f62cd08f0f0ab45818efeaba78b58310526f7b7e9686b8aeded1a926001600160401b03925f92610bcc575b50610bc790610b9e6001546001600160401b031690565b6040805198895260208901929092526001600160401b0316908701529116939081906060820190565b0390a3565b610bc7919250610bf39060203d602011610bfa575b610beb81836102e4565b8101906109b2565b9190610b87565b503d610be1565b61032e565b6004919350610c2c602091823d8411610c34575b610c2481836102e4565b810190610983565b939150610b36565b503d610c1a565b610c539060203d602011610c3457610c2481836102e4565b610aca565b6361aba18160e11b5f5260045ffd5b909194610c75868985610463565b610c7e816104a3565b610c8781610485565b610e2857610c9c816020610ca49301906103af565b8101906108b7565b90604051610cc981610cbb6020820194868661091f565b03601f1981018352826102e4565b5190208151909690610cf190610ce5906001600160a01b031681565b6001600160a01b031690565b6040830180519091906001600160a01b0316906060850191610d1a83516001600160801b031690565b823b156100b857610d44925f92836040518096819582946340c10f1960e01b845260048401610894565b03925af18015610c01576001958b927fd5277bc9597c7da3fab9cdbba4de6005f48b9eb7389cf2389c4ea9eea3172c2192610e0e575b506020810151610d9b906001600160a01b031695516001600160a01b031690565b8151610e0290608090610dbf906001600160a01b031697516001600160801b031690565b930151604080516001600160a01b0390981688526001600160801b0390941660208801529286019290925260a088901b8890039081169516939081906060820190565b0390a45b019190610a62565b80610e1c5f610e22936102e4565b806100bc565b5f610d7a565b610e3c816020610e449399949901906103af565b8101906105c6565b908585101561133557610ef696610e65610e5d8761066d565b968886610680565b6060840160406020610e778351611542565b929094608089019d8e51610e9085825192015160ff1690565b95833598610e9f878601610690565b8651635f8a996960e01b8152600481019490945260ff9889166024850152604484018b905288166064840152608483015290951660a48601529101803560c48501526020013560e484015282908190610104820190565b0381731c000000000000000000000000000000000001005afa908115610c01575f91611307575b50156112f857518951516040516bffffffffffffffffffffffff197f000000000000000000000000000000000000000000000000000000000000000060601b166020820152603481019290925260548083019190915281525f91610f959190610f876074836102e4565b610f8f6106bb565b906116b3565b98518099610fed610fd260806040610fbf60608701516bffffffffffffffffffffffff60a01b1690565b9501519d01516001600160801b03191690565b60405163f4a7eb1360e01b81529c8d94859460048601610776565b0381731c000000000000000000000000000000000001015afa978815610c01575f905f996112d1575b505f808a806112c6575b156112ba5750506110309061171f565b90915b60405161104981610cbb602082019489866107d5565b5190209861115b575050815161106990610ce5906001600160a01b031681565b602083018051909391906001600160a01b031691604081019261109384516001600160801b031690565b833b156100b8576110bd935f92836040518097819582946340c10f1960e01b845260048401610894565b03925af1908115610c015761112761111961110b6001988e967f95705d99ac13cf82894fd274cd871942e6f301c98c186271337e8fedbbb9d7ea96611147575b50516001600160a01b031690565b92516001600160a01b031690565b94516001600160801b031690565b9061113f604051928392898060a01b03169683610894565b0390a3610e06565b80610e1c5f611155936102e4565b5f6110fd565b835161117190610ce5906001600160a01b031681565b90604085019261118884516001600160801b031690565b833b156100b8575f6111b48d9582936040519485809481936340c10f1960e01b83528960048401610894565b03925af190816112a6575b506111ff57505083516111dd9150610ce5906001600160a01b031681565b6020840180519094906001600160a01b031683516001600160801b0316611093565b859392917ffc236d1b4402e76c2b0a882db36ad3a6fb0f5b6b7edc8ae317d993f10434c4369161129e61125f611251611243602060019c015160018060a01b031690565b98516001600160a01b031690565b96516001600160801b031690565b604080516001600160a01b0390981688526001600160801b03909116602088015286019290925260a088901b8890039081169516939081906060820190565b0390a4610e06565b80610e1c5f6112b4936102e4565b5f6111bf565b91509198505f98611033565b506040835114611020565b90506112f09198503d805f833e6112e881836102e4565b8101906106e6565b97905f611016565b63fb1f4a4960e01b5f5260045ffd5b611328915060203d811161132e575b61132081836102e4565b8101906106a7565b5f610f1d565b503d611316565b6351de8c1f60e01b5f5260045ffd5b61135281838598969861037e565b9061135c826103a5565b91602081019061136c82826103af565b9092604083019361137d85856103af565b919097606086019861138f8a886103af565b9061083f60921b3b156100b8575f956113bd93604051998a9788976374ae5b3760e11b8952600489016103e1565b03818361083f60921b5af18015610c01576001967f4ac4dcc08b0c26c3fb6b58c64c1392b7934b1ce6b0382a5986ea5c3de795e053946114209461143f9361144b575b50611428611417611410836103a5565b95836103af565b969098836103af565b9390926103af565b9290916040519687968c8060a01b03169987610429565b0390a201949294610a50565b80610e1c5f611459936102e4565b5f611400565b80610e1c5f61146d936102e4565b5f610a4a565b63bb62587160e01b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa908115610c01575f916114e2575b506001600160a01b03163314156109e1565b611504915060203d60201161150a575b6114fc81836102e4565b810190610316565b5f6114d0565b503d6114f2565b908160011b918083046002149015171561067b57565b906001820180921161067b57565b9190820180921161067b57565b6115739061156d604051602081019061156481610cbb84906006602083019252565b51902091611511565b90611535565b906115fc61158083611527565b6040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000818116600484015260248301969096527f0000000000000000000000001c0000000000000000000000000000000000000016949092909190602090849081906044820190565b0381885afa928315610c01575f93611680575b5082156112f8576040516381e3da6b60e01b81526001600160a01b03929092166004830152602482015292602090849060449082905afa928315610c01575f9361165c575b509160ff1690565b60ff9193506116799060203d602011610c3457610c2481836102e4565b9290611654565b61169a91935060203d602011610c3457610c2481836102e4565b915f61160f565b805191908290602001825e015f815290565b9161170760016116e161032b956116f295604051916020830152602082526116dc6040836102e4565b611768565b9260405194859160208301906116a1565b8260f81b815203601e198101855201836102e4565b604051906020820152602081526116dc6040826102e4565b9081516040810361173b57506034602083015160601c92015190565b633fbbeba160e21b5f52600452604060245260445ffd5b61032b93926040928252602082015201906116a1565b5f908051604081115f1461187457505f61178a602092604051918280926116a1565b039060025afa15610c015760205f611805610cbb6117f98351965b6040519283917f363636363636363636363636363636363636363636363636363636363636363689187f36363636363636363636363636363636363636363636363636363636363636368b18898501611752565b604051918280926116a1565b039060025afa15610c01576118647f5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c6117f95f93610cbb6020968651908560405196879518911889850191606093918352602083015260408201520190565b039060025afa15610c01575f5190565b60208083015194908211935091600184146118e357505f925b602082106118cd575b60408210166118b3575b505f611805610cbb6117f96020946117a5565b600160409190910360031b1b5f190119909116905f6118a0565b935f1960018360200360031b1b01191693611896565b604001519261188d56fea26469706673582212208e93ef9bfe51376039a34783438753d575cafb9c32630db748d87afe43a51c4a64736f6c634300081e0033" }, "0x1c00000000000000000000000000000000000002": { "nonce": "0x1", @@ -68,7 +68,7 @@ "0x1c00000000000000000000000000000000000003": { "nonce": "0x1", "balance": "0x0", - "code": "0x6080806040526004361015610012575f80fd5b5f3560e01c9081631beb1ab814610561575080631fbb25ad1461051d5780633488ce0d146102dd5780635c1bba381461023b5780636d46e98714610193578063a21de6d91461014f5763e202d99514610069575f80fd5b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb8116600483015260016024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d575b6040516001600160a01b039091168152602090f35b506020813d60201161013c575b816101276020938361067c565b8101031261013857602090516100f8565b5f80fd5b3d915061011a565b6040513d5f823e3d90fd5b34610138575f366003190112610138576040517f000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb6001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169081900361013857604051630b83774760e31b8152602081600481305afa908115610144575f916101f6575b506040516001600160a01b039091169091148152602090f35b90506020813d602011610233575b816102116020938361067c565b810103126101385751906001600160a01b0382168203610138579060206101dd565b3d9150610204565b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb811660048301525f6024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d576040516001600160a01b039091168152602090f35b34610138575f366003190112610138576040516381e3da6b60e01b81527f000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb6001600160a01b038181166004840152600660248401527f0000000000000000000000001c00000000000000000000000000000000000000169190602082604481865afa918215610144575f926104e9575b5081156104da576040516020810190600682526020815261038f60408261067c565b519020915f1981019081116104c6578060011b90808204600214901517156104c65782018092116104c65760018201908183116104c6576040516381e3da6b60e01b81526001600160a01b03821660048201526024810193909352602083604481875afa928315610144575f9361048e575b506040516381e3da6b60e01b81526001600160a01b03909116600482015260248101919091529160209083908180604481015b03915afa918215610144575f92610459575b5060ff6040928351928352166020820152f35b91506020823d602011610486575b816104746020938361067c565b810103126101385790519060ff610446565b3d9150610467565b919092506020823d6020116104be575b816104ab6020938361067c565b8101031261013857905191610434610401565b3d915061049e565b634e487b7160e01b5f52601160045260245ffd5b630c322fb560e31b5f5260045ffd5b9091506020813d602011610515575b816105056020938361067c565b810103126101385751908361036d565b3d91506104f8565b34610138575f366003190112610138576040517f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169190829003610138576105fe9181602080930191825260076040820152604081526105ab60608261067c565b5190206040516381e3da6b60e01b81526001600160a01b037f000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb166004820152602481019190915291829081906044820190565b03817f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03165afa8015610144575f90610649575b60209060ff604051911615158152f35b506020813d602011610674575b816106636020938361067c565b810103126101385760209051610639565b3d9150610656565b90601f8019910116810190811067ffffffffffffffff82111761069e57604052565b634e487b7160e01b5f52604160045260245ffdfea26469706673582212202123abc3d91c41a1be59b6f06bfc92259b93aa367f581f04eda761e4ed25c63c64736f6c634300081e0033" + "code": "0x6080806040526004361015610012575f80fd5b5f3560e01c9081631beb1ab814610561575080631fbb25ad1461051d5780633488ce0d146102dd5780635c1bba381461023b5780636d46e98714610193578063a21de6d91461014f5763e202d99514610069575f80fd5b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260016024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d575b6040516001600160a01b039091168152602090f35b506020813d60201161013c575b816101276020938361067c565b8101031261013857602090516100f8565b5f80fd5b3d915061011a565b6040513d5f823e3d90fd5b34610138575f366003190112610138576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169081900361013857604051630b83774760e31b8152602081600481305afa908115610144575f916101f6575b506040516001600160a01b039091169091148152602090f35b90506020813d602011610233575b816102116020938361067c565b810103126101385751906001600160a01b0382168203610138579060206101dd565b3d9150610204565b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d576040516001600160a01b039091168152602090f35b34610138575f366003190112610138576040516381e3da6b60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038181166004840152600660248401527f0000000000000000000000001c00000000000000000000000000000000000000169190602082604481865afa918215610144575f926104e9575b5081156104da576040516020810190600682526020815261038f60408261067c565b519020915f1981019081116104c6578060011b90808204600214901517156104c65782018092116104c65760018201908183116104c6576040516381e3da6b60e01b81526001600160a01b03821660048201526024810193909352602083604481875afa928315610144575f9361048e575b506040516381e3da6b60e01b81526001600160a01b03909116600482015260248101919091529160209083908180604481015b03915afa918215610144575f92610459575b5060ff6040928351928352166020820152f35b91506020823d602011610486575b816104746020938361067c565b810103126101385790519060ff610446565b3d9150610467565b919092506020823d6020116104be575b816104ab6020938361067c565b8101031261013857905191610434610401565b3d915061049e565b634e487b7160e01b5f52601160045260245ffd5b630c322fb560e31b5f5260045ffd5b9091506020813d602011610515575b816105056020938361067c565b810103126101385751908361036d565b3d91506104f8565b34610138575f366003190112610138576040517f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169190829003610138576105fe9181602080930191825260076040820152604081526105ab60608261067c565b5190206040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152602481019190915291829081906044820190565b03817f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03165afa8015610144575f90610649575b60209060ff604051911615158152f35b506020813d602011610674575b816106636020938361067c565b810103126101385760209051610639565b3d9150610656565b90601f8019910116810190811067ffffffffffffffff82111761069e57604052565b634e487b7160e01b5f52604160045260245ffdfea26469706673582212202123abc3d91c41a1be59b6f06bfc92259b93aa367f581f04eda761e4ed25c63c64736f6c634300081e0033" }, "0x1c00000000000000000000000000000000000004": { "nonce": "0x1",