diff --git a/crates/contracts/src/precompiles/zone_factory.rs b/crates/contracts/src/precompiles/zone_factory.rs index 471ee1839..986320887 100644 --- a/crates/contracts/src/precompiles/zone_factory.rs +++ b/crates/contracts/src/precompiles/zone_factory.rs @@ -1,11 +1,16 @@ //! `ZoneFactory` — deployed on Tempo L1. -use alloy_primitives::{Address, address}; +use alloy_primitives::{Address, FixedBytes, address, fixed_bytes}; pub use ZoneFactory::ZoneInfo; /// Protocol-managed ZoneFactory address defined by TIP-1091. pub const ZONE_FACTORY_ADDRESS: Address = address!("0x5aF2000000000000000000000000000000000000"); +pub const ZONE_PORTAL_PREFIX: FixedBytes<12> = fixed_bytes!("5AD000000000000000000000"); +pub const ZONE_PORTAL_IMPL_ADDRESS: Address = + address!("0x5AD1000000000000000000000000000000000000"); +pub const ZONE_VERIFIER_ADDRESS: Address = address!("0x5a56000000000000000000000000000000000000"); +pub const ZONE_MESSENGER_ADDRESS: Address = address!("0x5A4d000000000000000000000000000000000000"); crate::sol! { #[derive(Debug)] @@ -16,7 +21,6 @@ crate::sol! { address initialToken; address admin; address sequencer; - address verifier; bytes32 genesisBlockHash; bytes32 genesisTempoBlockHash; uint64 genesisTempoBlockNumber; @@ -31,7 +35,6 @@ crate::sol! { address initialToken; address admin; address sequencer; - address verifier; ZoneParams zoneParams; string rpcUrl; } @@ -47,10 +50,8 @@ crate::sol! { uint64 genesisTempoBlockNumber ); function createZone(CreateZoneParams calldata params) external returns (uint32 zoneId, address portal); - function verifier() external view returns (address); - function messenger() external view returns (address); function zones(uint32 zoneId) external view returns (ZoneInfo memory); - function zoneCount() external view returns (uint32); + function nextZoneId() external view returns (uint32); function isZonePortal(address portal) external view returns (bool); } } diff --git a/crates/node/assets/zone-dev-genesis.json b/crates/node/assets/zone-dev-genesis.json index 59db06c6f..3a459e9ca 100644 --- a/crates/node/assets/zone-dev-genesis.json +++ b/crates/node/assets/zone-dev-genesis.json @@ -20,17 +20,17 @@ }, "0x1c00000000000000000000000000000000000001": { "balance": "0x0", - "code": "0x60806040526004361015610011575f80fd5b5f3560e01c80631fbb25ad146100945780632d4884821461008f57806379502c551461008a57806382648c3b14610085578063857e85f81461008057806386516ec01461007b578063a21de6d9146100765763bffa55d514610071575f80fd5b610356565b610312565b610252565b61018a565b610150565b61010c565b6100e6565b346100d8575f3660031901126100d8577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03166080908152602090f35b5f80fd5b5f9103126100d857565b346100d8575f3660031901126100d85760206001600160401b0360015416604051908152f35b346100d8575f3660031901126100d8576040517f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03168152602090f35b346100d8575f3660031901126100d85760205f54604051908152f35b6001600160a01b038116036100d857565b35906101888261016c565b565b346100d85760403660031901126100d85760206001600160801b036101e86004356101b48161016c565b602435906101c18261016c565b60018060a01b03165f526002845260405f209060018060a01b03165f5260205260405f2090565b5416604051908152f35b9181601f840112156100d8578235916001600160401b0383116100d8576020808501948460051b0101116100d857565b9181601f840112156100d8578235916001600160401b0383116100d8576020808501948460071b0101116100d857565b346100d85760803660031901126100d8576004356001600160401b0381116100d857366023820112156100d8578060040135906001600160401b0382116100d85736602483830101116100d8576024356001600160401b0381116100d8576102be9036906004016101f2565b6044929192356001600160401b0381116100d8576102e0903690600401610222565b91606435946001600160401b0386116100d8576103109661030760249736906004016101f2565b97909601610c10565b005b346100d8575f3660031901126100d8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100d85760203660031901126100d8576004356103738161016c565b6001600160a01b0381165f8181526002602081815260408084203380865281845291852054959094529190526001600160801b0390921692916103db916103cb91905b9060018060a01b03165f5260205260405f2090565b80546001600160801b0319169055565b6001600160a01b031690813b156100d8576040516340c10f1960e01b8152915f838061040b853360048401610aad565b038183855af19283156104915761047393610477575b506040516001600160801b038316815233907fffd3bbab073ab4b2d0792c270104924c14c285a153b9acddabae166395d2eb5c90602090a36040516001600160801b0390911681529081906020820190565b0390f35b806104855f61048b936104e5565b806100dc565b5f610421565b61051e565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b038211176104c557604052565b610496565b60c081019081106001600160401b038211176104c557604052565b90601f801991011681019081106001600160401b038211176104c557604052565b908160209103126100d8575161051b8161016c565b90565b6040513d5f823e3d90fd5b908060209392818452848401375f828201840152601f01601f1916010190565b91602061051b938181520191610529565b634e487b7160e01b5f52603260045260245ffd5b91908110156105905760051b81013590607e19813603018212156100d8570190565b61055a565b3561051b8161016c565b903590601e19813603018212156100d857018035906001600160401b0382116100d8576020019181360383136100d857565b9593916105fd9061060b9461051b99979360018060a01b03168952608060208a01526080890191610529565b918683036040880152610529565b926060818503910152610529565b9492909361063761051b979561064594606089526060890191610529565b918683036020880152610529565b926040818503910152610529565b91908110156105905760051b81013590605e19813603018212156100d8570190565b6002111561067f57565b634e487b7160e01b5f52602160045260245ffd5b3560028110156100d85790565b35906001600160801b03821682036100d857565b60ff8116036100d857565b6001600160401b0381116104c557601f01601f191660200190565b35906001600160a01b0319821682036100d857565b35906001600160801b0319821682036100d857565b919060a0838203126100d8576040519061071d826104aa565b8193803583526020810135610731816106b4565b602084015260408101356001600160401b0381116100d857810182601f820112156100d857803591610762836106bf565b9361077060405195866104e5565b838552602084840101116100d8576080935f6020856107b19682899701838601378301015260408601526107a6606082016106da565b6060860152016106ef565b910152565b6020818303126100d8578035906001600160401b0382116100d8570160c0818303126100d857604051916107e9836104ca565b81356107f48161016c565b83526108026020830161017d565b6020840152610813604083016106a0565b60408401526108246060830161017d565b60608401526080820135608084015260a08201356001600160401b0381116100d8576108509201610704565b60a082015290565b90600282101561067f5752565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b92919060a060409161089c866001610858565b60606020870152600180831b038151166060870152600180831b0360208201511660808701526001600160801b03838201511682870152600180831b0360608201511660c0870152608081015160e0870152015160c0610100860152805161012086015260ff6020820151166101408601526109288282015160a06101608801526101c0870190610865565b60608201516001600160a01b0319166101808701526080909101516001600160801b0319166101a0860152930152565b801515036100d857565b3561051b81610958565b634e487b7160e01b5f52601160045260245ffd5b5f19811461098e5760010190565b61096c565b91908110156105905760071b0190565b3561051b816106b4565b908160209103126100d8575161051b81610958565b604051906109d16040836104e5565b600d82526c65636965732d6165732d6b657960981b6020830152565b91906040838203126100d85782516001600160401b0381116100d85783019080601f830112156100d8578151610a22816106bf565b91610a3060405193846104e5565b818352602082850101116100d8576020815f92828096018386015e8301015292015161051b81610958565b92610a919060809360209397969786526bffffffffffffffffffffffff60a01b168386015260a0604086015260a0850190610865565b83810360608501525f815201936001600160801b031916910152565b6001600160a01b0390911681526001600160801b03909116602082015260400190565b908160c09103126100d85760a060405191610aea836104ca565b8035610af58161016c565b83526020810135610b058161016c565b60208401526040810135610b188161016c565b6040840152610b29606082016106a0565b60608401526080810135610b3c8161016c565b6080840152013560a082015290565b60e0909392919360a0610100820195610b64835f610858565b600180831b038151166020840152600180831b036020820151166040840152600180831b0360408201511660608401526001600160801b036060820151166080840152600180831b0360808201511682840152015160c08201520152565b908160209103126100d8575190565b906001600160401b03809116911601906001600160401b03821161098e57565b908160209103126100d857516001600160401b03811681036100d85790565b959194939296903315158061172b575b61171c577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b031696873b156100d85760405163fe77009960e01b8152915f9183918291610c78919060048401610549565b0381838b5af1801561049157611708575b505f9492945b8181106115ed575050505f54925f915f915b878310610e9f5750505003610e90576040516381e3da6b60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600482015260056024820152602081604481865afa801561049157610e73575b50805f55610d4e610d326001600160401b038516610d2d6001546001600160401b031690565b610bd1565b6001600160401b03166001600160401b03196001541617600155565b604051631014997960e31b815291602083600481845afa928315610491575f93610e3e575b50602060049160405192838092631d04645f60e01b82525afa8015610491577fd2d2bf1e295f62cd08f0f0ab45818efeaba78b58310526f7b7e9686b8aeded1a926001600160401b03925f92610e09575b50610e0490610ddb6001546001600160401b031690565b6040805198895260208901929092526001600160401b0316908701529116939081906060820190565b0390a3565b610e04919250610e309060203d602011610e37575b610e2881836104e5565b810190610bf1565b9190610dc4565b503d610e1e565b6004919350610e64602091823d8411610e6c575b610e5c81836104e5565b810190610bc2565b939150610d73565b503d610e52565b610e8b9060203d602011610e6c57610e5c81836104e5565b610d07565b6361aba18160e11b5f5260045ffd5b909194610ead868985610653565b95610eb787610693565b610ec081610675565b6111c957610edc610ed4602089018961059f565b810190610ad0565b91604051610f0181610ef360208201948786610b4b565b03601f1981018352826104e5565b51902060808301805191989091610f28906001600160a01b03165b6001600160a01b031690565b610f41575050610f39600192611bd0565b019190610ca1565b6040610f4d9101610962565b15610fa35760208301518351600194610f9e936001600160a01b03938416939092610f9791610f8991606091169301516001600160801b031690565b92516001600160a01b031690565b928b611828565b610f39565b8251610fb990610f1c906001600160a01b031681565b604084018051909291906001600160a01b0316946060810192610fe384516001600160801b031690565b92803b156100d8575f8d946110129260019a836040518096819582946340c10f1960e01b845260048401610aad565b03925af190816111b5575b506111135781517f3c1af70310b8c9d43b0a7207217f398e4a3114f1728987c40addb451399ac87c9290611070906001600160a01b031686516001600160801b031684516001600160a01b031691611b45565b61110b6110ca6110bc6110ae6110a0611092602087015160018060a01b031690565b9a516001600160a01b031690565b94516001600160a01b031690565b97516001600160801b031690565b93516001600160a01b031690565b604080516001600160a01b0398891681526001600160801b03909516602086015296169583019590955260a088901b88900390811695169381906060820190565b0390a4610f39565b5060208101517fd5277bc9597c7da3fab9cdbba4de6005f48b9eb7389cf2389c4ea9eea3172c219190611157906001600160a01b031695516001600160a01b031690565b815161110b9060a090611172906001600160a01b03166110ae565b930151604080516001600160a01b0390981688526001600160801b0390941660208801529286019290925260a088901b8890039081169516939081906060820190565b806104855f6111c3936104e5565b5f61101d565b61120660406111e66111de60208b018b61059f565b8101906107b6565b9381516111fc81610ef360208201948986610889565b5190209801610962565b61159b578585101561158c5761122661121e86610980565b958785610993565b6080830161123481516118a2565b92906020604060a08801936112b9855161125385825192015160ff1690565b988335966112628786016109a3565b8651635f8a996960e01b8152600481019490945260ff9b8c166024850152604484018990528b166064840152608483015290981660a48901529101803560c48801526020013560e487015285908190610104820190565b0381731c000000000000000000000000000000000001005afa938415610491575f9461155c575b508392606094611444575b505050158015611438575b61142b5761130390611b12565b835191939161131c90610f1c906001600160a01b031681565b604083019161133283516001600160801b031690565b95823b156100d8575f806113618e9560019a6040519485809481936340c10f1960e01b83528960048401610aad565b03925af19081611417575b5061137e575050610f9e929150611a8e565b60208501517ffc236d1b4402e76c2b0a882db36ad3a6fb0f5b6b7edc8ae317d993f10434c43692919061110b906113d8906113ca906001600160a01b031698516001600160a01b031690565b96516001600160801b031690565b604080516001600160a01b0390981688526001600160801b03909116602088015286019290925260a088901b8890039081169516939081906060820190565b806104855f611425936104e5565b5f61136c565b50610f9e60019288611a8e565b506040815114156112f6565b518251516040516bffffffffffffffffffffffff197f000000000000000000000000000000000000000000000000000000000000000060601b166020820152603481019290925260548083019190915281525f93506114ce916114bb91906114ad6074836104e5565b6114b56109c2565b90611a22565b9151938401516001600160a01b03191690565b906115076114ec608060408701519601516001600160801b03191690565b60405163f4a7eb1360e01b8152958694859460048601610a5b565b0381731c000000000000000000000000000000000001015afa8015610491575f915f91611538575b505f80806112eb565b905061155691503d805f833e61154e81836104e5565b8101906109ed565b5f61152f565b61157e91945060203d8111611585575b61157681836104e5565b8101906109ad565b925f6112e0565b503d61156c565b6351de8c1f60e01b5f5260045ffd5b6020820151600192610f9e916001600160a01b031681519091906001600160a01b03166115e660606115d760408501516001600160801b031690565b9301516001600160a01b031690565b928b6117ba565b6115fb81838598969861056e565b9061160582610595565b916020810190611615828261059f565b90926040830193611626858561059f565b91909760608601986116388a8861059f565b9061083f60921b3b156100d8575f9561166693604051998a9788976374ae5b3760e11b8952600489016105d1565b03818361083f60921b5af18015610491576001967f4ac4dcc08b0c26c3fb6b58c64c1392b7934b1ce6b0382a5986ea5c3de795e053946116c9946116e8936116f4575b506116d16116c06116b983610595565b958361059f565b9690988361059f565b93909261059f565b9290916040519687968c8060a01b03169987610619565b0390a201949294610c8f565b806104855f611702936104e5565b5f6116a9565b806104855f611716936104e5565b5f610c89565b63bb62587160e01b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa908115610491575f9161178b575b506001600160a01b0316331415610c20565b6117ad915060203d6020116117b3575b6117a581836104e5565b810190610506565b5f611779565b503d61179b565b92907f4620415fad9c416306a56ca0ee640b3418628a5f2e45ddde3ddf7452a7a654fb92946001600160801b036080936117f583828a611b45565b60405197611804896001610858565b6001600160a01b0390811660208a01529116604088015290811660608701521693a3565b92907f4620415fad9c416306a56ca0ee640b3418628a5f2e45ddde3ddf7452a7a654fb92946001600160801b0360809361186383828a611b45565b60405197611804895f610858565b908160011b918083046002149015171561098e57565b906001820180921161098e57565b9190820180921161098e57565b6118d3906118cd60405160208101906118c481610ef384906007602083019252565b51902091611871565b90611895565b9061195c6118e083611887565b6040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000818116600484015260248301969096527f0000000000000000000000001c0000000000000000000000000000000000000016949092909190602090849081906044820190565b0381885afa928315610491575f936119ef575b5082156119e0576040516381e3da6b60e01b81526001600160a01b03929092166004830152602482015292602090849060449082905afa928315610491575f936119bc575b509160ff1690565b60ff9193506119d99060203d602011610e6c57610e5c81836104e5565b92906119b4565b63fb1f4a4960e01b5f5260045ffd5b611a0991935060203d602011610e6c57610e5c81836104e5565b915f61196f565b805191908290602001825e015f815290565b91611a766001611a5061051b95611a619560405191602083015260208252611a4b6040836104e5565b611e00565b926040519485916020830190611a10565b8260f81b815203601e198101855201836104e5565b60405190602082015260208152611a4b6040826104e5565b815160408301805160608501517f95705d99ac13cf82894fd274cd871942e6f301c98c186271337e8fedbbb9d7ea93611adf926001600160a01b03928316926001600160801b039091169116611b45565b6020840151935190516040516001600160a01b039586169590928392610e04926001600160801b03909116911683610aad565b90815160408103611b2e57506034602083015160601c92015190565b633fbbeba160e21b5f52600452604060245260445ffd5b9060026007609a1b013b156100d8576040516338b8fb9760e21b81526001600160a01b0392831660048201526001600160801b03919091166024820152911660448201525f816064818360026007609a1b015af1801561049157611ba65750565b5f610188916104e5565b906001600160801b03809116911601906001600160801b03821161098e57565b6040810151611c289190602090611bff90611bf3906001600160a01b0316610f1c565b6001600160401b031690565b60405163a3a124c360e01b81526001600160401b03909116600482015292839081906024820190565b03815f60026007609a1b015af1918215610491575f92611dc9575b508051611c5a90610f1c906001600160a01b031681565b916060820192611c7184516001600160801b031690565b90803b156100d8576040516340c10f1960e01b8152915f918391829084908290611c9f908960048401610aad565b03925af19081611db5575b50611d7e57611d5e611d507f92d91a50ae3561d4edd8eadad5f27f09116faaa4f733bd37682c49b4cbc20e3993611d43611ceb87516001600160801b031690565b82516001600160a01b03165f908152600260205260409020611d2990611d129088906103b6565b91611d2483546001600160801b031690565b611bb0565b6001600160801b03166001600160801b0319825416179055565b516001600160a01b031690565b93516001600160801b031690565b6040516001600160a01b03909216938291611d799183610aad565b0390a2565b90517fbc1cf3ff6e619587619408b396a13775509216474757afb9d29bda1a96f590f09190611d5e906001600160a01b0316611d50565b806104855f611dc3936104e5565b5f611caa565b611de391925060203d6020116117b3576117a581836104e5565b905f611c43565b61051b9392604092825260208201520190611a10565b5f908051604081115f14611f0c57505f611e2260209260405191828092611a10565b039060025afa156104915760205f611e9d610ef3611e918351965b6040519283917f363636363636363636363636363636363636363636363636363636363636363689187f36363636363636363636363636363636363636363636363636363636363636368b18898501611dea565b60405191828092611a10565b039060025afa1561049157611efc7f5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c611e915f93610ef36020968651908560405196879518911889850191606093918352602083015260408201520190565b039060025afa15610491575f5190565b6020808301519490821193509160018414611f7b57505f925b60208210611f65575b6040821016611f4b575b505f611e9d610ef3611e91602094611e3d565b600160409190910360031b1b5f190119909116905f611f38565b935f1960018360200360031b1b01191693611f2e565b6040015192611f2556fea2646970667358221220e80c7e3562412094e83efcfc1088d74d9d32d775e167c96b426c9c96a32fae8164736f6c63430008230033", + "code": "0x60806040526004361015610011575f80fd5b5f3560e01c80631fbb25ad146100945780632d4884821461008f57806379502c551461008a57806382648c3b14610085578063857e85f81461008057806386516ec01461007b578063a21de6d9146100765763bffa55d514610071575f80fd5b610356565b610312565b610252565b61018a565b610150565b61010c565b6100e6565b346100d8575f3660031901126100d8577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03166080908152602090f35b5f80fd5b5f9103126100d857565b346100d8575f3660031901126100d85760206001600160401b0360015416604051908152f35b346100d8575f3660031901126100d8576040517f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03168152602090f35b346100d8575f3660031901126100d85760205f54604051908152f35b6001600160a01b038116036100d857565b35906101888261016c565b565b346100d85760403660031901126100d85760206001600160801b036101e86004356101b48161016c565b602435906101c18261016c565b60018060a01b03165f526002845260405f209060018060a01b03165f5260205260405f2090565b5416604051908152f35b9181601f840112156100d8578235916001600160401b0383116100d8576020808501948460051b0101116100d857565b9181601f840112156100d8578235916001600160401b0383116100d8576020808501948460071b0101116100d857565b346100d85760803660031901126100d8576004356001600160401b0381116100d857366023820112156100d8578060040135906001600160401b0382116100d85736602483830101116100d8576024356001600160401b0381116100d8576102be9036906004016101f2565b6044929192356001600160401b0381116100d8576102e0903690600401610222565b91606435946001600160401b0386116100d8576103109661030760249736906004016101f2565b97909601610c10565b005b346100d8575f3660031901126100d8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100d85760203660031901126100d8576004356103738161016c565b6001600160a01b0381165f8181526002602081815260408084203380865281845291852054959094529190526001600160801b0390921692916103db916103cb91905b9060018060a01b03165f5260205260405f2090565b80546001600160801b0319169055565b6001600160a01b031690813b156100d8576040516340c10f1960e01b8152915f838061040b853360048401610aad565b038183855af19283156104915761047393610477575b506040516001600160801b038316815233907fffd3bbab073ab4b2d0792c270104924c14c285a153b9acddabae166395d2eb5c90602090a36040516001600160801b0390911681529081906020820190565b0390f35b806104855f61048b936104e5565b806100dc565b5f610421565b61051e565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b038211176104c557604052565b610496565b60c081019081106001600160401b038211176104c557604052565b90601f801991011681019081106001600160401b038211176104c557604052565b908160209103126100d8575161051b8161016c565b90565b6040513d5f823e3d90fd5b908060209392818452848401375f828201840152601f01601f1916010190565b91602061051b938181520191610529565b634e487b7160e01b5f52603260045260245ffd5b91908110156105905760051b81013590607e19813603018212156100d8570190565b61055a565b3561051b8161016c565b903590601e19813603018212156100d857018035906001600160401b0382116100d8576020019181360383136100d857565b9593916105fd9061060b9461051b99979360018060a01b03168952608060208a01526080890191610529565b918683036040880152610529565b926060818503910152610529565b9492909361063761051b979561064594606089526060890191610529565b918683036020880152610529565b926040818503910152610529565b91908110156105905760051b81013590605e19813603018212156100d8570190565b6002111561067f57565b634e487b7160e01b5f52602160045260245ffd5b3560028110156100d85790565b35906001600160801b03821682036100d857565b60ff8116036100d857565b6001600160401b0381116104c557601f01601f191660200190565b35906001600160a01b0319821682036100d857565b35906001600160801b0319821682036100d857565b919060a0838203126100d8576040519061071d826104aa565b8193803583526020810135610731816106b4565b602084015260408101356001600160401b0381116100d857810182601f820112156100d857803591610762836106bf565b9361077060405195866104e5565b838552602084840101116100d8576080935f6020856107b19682899701838601378301015260408601526107a6606082016106da565b6060860152016106ef565b910152565b6020818303126100d8578035906001600160401b0382116100d8570160c0818303126100d857604051916107e9836104ca565b81356107f48161016c565b83526108026020830161017d565b6020840152610813604083016106a0565b60408401526108246060830161017d565b60608401526080820135608084015260a08201356001600160401b0381116100d8576108509201610704565b60a082015290565b90600282101561067f5752565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b92919060a060409161089c866001610858565b60606020870152600180831b038151166060870152600180831b0360208201511660808701526001600160801b03838201511682870152600180831b0360608201511660c0870152608081015160e0870152015160c0610100860152805161012086015260ff6020820151166101408601526109288282015160a06101608801526101c0870190610865565b60608201516001600160a01b0319166101808701526080909101516001600160801b0319166101a0860152930152565b801515036100d857565b3561051b81610958565b634e487b7160e01b5f52601160045260245ffd5b5f19811461098e5760010190565b61096c565b91908110156105905760071b0190565b3561051b816106b4565b908160209103126100d8575161051b81610958565b604051906109d16040836104e5565b600d82526c65636965732d6165732d6b657960981b6020830152565b91906040838203126100d85782516001600160401b0381116100d85783019080601f830112156100d8578151610a22816106bf565b91610a3060405193846104e5565b818352602082850101116100d8576020815f92828096018386015e8301015292015161051b81610958565b92610a919060809360209397969786526bffffffffffffffffffffffff60a01b168386015260a0604086015260a0850190610865565b83810360608501525f815201936001600160801b031916910152565b6001600160a01b0390911681526001600160801b03909116602082015260400190565b908160c09103126100d85760a060405191610aea836104ca565b8035610af58161016c565b83526020810135610b058161016c565b60208401526040810135610b188161016c565b6040840152610b29606082016106a0565b60608401526080810135610b3c8161016c565b6080840152013560a082015290565b60e0909392919360a0610100820195610b64835f610858565b600180831b038151166020840152600180831b036020820151166040840152600180831b0360408201511660608401526001600160801b036060820151166080840152600180831b0360808201511682840152015160c08201520152565b908160209103126100d8575190565b906001600160401b03809116911601906001600160401b03821161098e57565b908160209103126100d857516001600160401b03811681036100d85790565b959194939296903315158061172b575b61171c577f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b031696873b156100d85760405163fe77009960e01b8152915f9183918291610c78919060048401610549565b0381838b5af1801561049157611708575b505f9492945b8181106115ed575050505f54925f915f915b878310610e9f5750505003610e90576040516381e3da6b60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600482015260056024820152602081604481865afa801561049157610e73575b50805f55610d4e610d326001600160401b038516610d2d6001546001600160401b031690565b610bd1565b6001600160401b03166001600160401b03196001541617600155565b604051631014997960e31b815291602083600481845afa928315610491575f93610e3e575b50602060049160405192838092631d04645f60e01b82525afa8015610491577fd2d2bf1e295f62cd08f0f0ab45818efeaba78b58310526f7b7e9686b8aeded1a926001600160401b03925f92610e09575b50610e0490610ddb6001546001600160401b031690565b6040805198895260208901929092526001600160401b0316908701529116939081906060820190565b0390a3565b610e04919250610e309060203d602011610e37575b610e2881836104e5565b810190610bf1565b9190610dc4565b503d610e1e565b6004919350610e64602091823d8411610e6c575b610e5c81836104e5565b810190610bc2565b939150610d73565b503d610e52565b610e8b9060203d602011610e6c57610e5c81836104e5565b610d07565b6361aba18160e11b5f5260045ffd5b909194610ead868985610653565b95610eb787610693565b610ec081610675565b6111c957610edc610ed4602089018961059f565b810190610ad0565b91604051610f0181610ef360208201948786610b4b565b03601f1981018352826104e5565b51902060808301805191989091610f28906001600160a01b03165b6001600160a01b031690565b610f41575050610f39600192611bd0565b019190610ca1565b6040610f4d9101610962565b15610fa35760208301518351600194610f9e936001600160a01b03938416939092610f9791610f8991606091169301516001600160801b031690565b92516001600160a01b031690565b928b611828565b610f39565b8251610fb990610f1c906001600160a01b031681565b604084018051909291906001600160a01b0316946060810192610fe384516001600160801b031690565b92803b156100d8575f8d946110129260019a836040518096819582946340c10f1960e01b845260048401610aad565b03925af190816111b5575b506111135781517f3c1af70310b8c9d43b0a7207217f398e4a3114f1728987c40addb451399ac87c9290611070906001600160a01b031686516001600160801b031684516001600160a01b031691611b45565b61110b6110ca6110bc6110ae6110a0611092602087015160018060a01b031690565b9a516001600160a01b031690565b94516001600160a01b031690565b97516001600160801b031690565b93516001600160a01b031690565b604080516001600160a01b0398891681526001600160801b03909516602086015296169583019590955260a088901b88900390811695169381906060820190565b0390a4610f39565b5060208101517fd5277bc9597c7da3fab9cdbba4de6005f48b9eb7389cf2389c4ea9eea3172c219190611157906001600160a01b031695516001600160a01b031690565b815161110b9060a090611172906001600160a01b03166110ae565b930151604080516001600160a01b0390981688526001600160801b0390941660208801529286019290925260a088901b8890039081169516939081906060820190565b806104855f6111c3936104e5565b5f61101d565b61120660406111e66111de60208b018b61059f565b8101906107b6565b9381516111fc81610ef360208201948986610889565b5190209801610962565b61159b578585101561158c5761122661121e86610980565b958785610993565b6080830161123481516118a2565b92906020604060a08801936112b9855161125385825192015160ff1690565b988335966112628786016109a3565b8651635f8a996960e01b8152600481019490945260ff9b8c166024850152604484018990528b166064840152608483015290981660a48901529101803560c48801526020013560e487015285908190610104820190565b0381731c000000000000000000000000000000000001005afa938415610491575f9461155c575b508392606094611444575b505050158015611438575b61142b5761130390611b12565b835191939161131c90610f1c906001600160a01b031681565b604083019161133283516001600160801b031690565b95823b156100d8575f806113618e9560019a6040519485809481936340c10f1960e01b83528960048401610aad565b03925af19081611417575b5061137e575050610f9e929150611a8e565b60208501517ffc236d1b4402e76c2b0a882db36ad3a6fb0f5b6b7edc8ae317d993f10434c43692919061110b906113d8906113ca906001600160a01b031698516001600160a01b031690565b96516001600160801b031690565b604080516001600160a01b0390981688526001600160801b03909116602088015286019290925260a088901b8890039081169516939081906060820190565b806104855f611425936104e5565b5f61136c565b50610f9e60019288611a8e565b506040815114156112f6565b518251516040516bffffffffffffffffffffffff197f000000000000000000000000000000000000000000000000000000000000000060601b166020820152603481019290925260548083019190915281525f93506114ce916114bb91906114ad6074836104e5565b6114b56109c2565b90611a22565b9151938401516001600160a01b03191690565b906115076114ec608060408701519601516001600160801b03191690565b60405163f4a7eb1360e01b8152958694859460048601610a5b565b0381731c000000000000000000000000000000000001015afa8015610491575f915f91611538575b505f80806112eb565b905061155691503d805f833e61154e81836104e5565b8101906109ed565b5f61152f565b61157e91945060203d8111611585575b61157681836104e5565b8101906109ad565b925f6112e0565b503d61156c565b6351de8c1f60e01b5f5260045ffd5b6020820151600192610f9e916001600160a01b031681519091906001600160a01b03166115e660606115d760408501516001600160801b031690565b9301516001600160a01b031690565b928b6117ba565b6115fb81838598969861056e565b9061160582610595565b916020810190611615828261059f565b90926040830193611626858561059f565b91909760608601986116388a8861059f565b9061083f60921b3b156100d8575f9561166693604051998a9788976374ae5b3760e11b8952600489016105d1565b03818361083f60921b5af18015610491576001967f4ac4dcc08b0c26c3fb6b58c64c1392b7934b1ce6b0382a5986ea5c3de795e053946116c9946116e8936116f4575b506116d16116c06116b983610595565b958361059f565b9690988361059f565b93909261059f565b9290916040519687968c8060a01b03169987610619565b0390a201949294610c8f565b806104855f611702936104e5565b5f6116a9565b806104855f611716936104e5565b5f610c89565b63bb62587160e01b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa908115610491575f9161178b575b506001600160a01b0316331415610c20565b6117ad915060203d6020116117b3575b6117a581836104e5565b810190610506565b5f611779565b503d61179b565b92907f4620415fad9c416306a56ca0ee640b3418628a5f2e45ddde3ddf7452a7a654fb92946001600160801b036080936117f583828a611b45565b60405197611804896001610858565b6001600160a01b0390811660208a01529116604088015290811660608701521693a3565b92907f4620415fad9c416306a56ca0ee640b3418628a5f2e45ddde3ddf7452a7a654fb92946001600160801b0360809361186383828a611b45565b60405197611804895f610858565b908160011b918083046002149015171561098e57565b906001820180921161098e57565b9190820180921161098e57565b6118d3906118cd60405160208101906118c481610ef384906007602083019252565b51902091611871565b90611895565b9061195c6118e083611887565b6040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000818116600484015260248301969096527f0000000000000000000000001c0000000000000000000000000000000000000016949092909190602090849081906044820190565b0381885afa928315610491575f936119ef575b5082156119e0576040516381e3da6b60e01b81526001600160a01b03929092166004830152602482015292602090849060449082905afa928315610491575f936119bc575b509160ff1690565b60ff9193506119d99060203d602011610e6c57610e5c81836104e5565b92906119b4565b63fb1f4a4960e01b5f5260045ffd5b611a0991935060203d602011610e6c57610e5c81836104e5565b915f61196f565b805191908290602001825e015f815290565b91611a766001611a5061051b95611a619560405191602083015260208252611a4b6040836104e5565b611e00565b926040519485916020830190611a10565b8260f81b815203601e198101855201836104e5565b60405190602082015260208152611a4b6040826104e5565b815160408301805160608501517f95705d99ac13cf82894fd274cd871942e6f301c98c186271337e8fedbbb9d7ea93611adf926001600160a01b03928316926001600160801b039091169116611b45565b6020840151935190516040516001600160a01b039586169590928392610e04926001600160801b03909116911683610aad565b90815160408103611b2e57506034602083015160601c92015190565b633fbbeba160e21b5f52600452604060245260445ffd5b9060026007609a1b013b156100d8576040516338b8fb9760e21b81526001600160a01b0392831660048201526001600160801b03919091166024820152911660448201525f816064818360026007609a1b015af1801561049157611ba65750565b5f610188916104e5565b906001600160801b03809116911601906001600160801b03821161098e57565b6040810151611c289190602090611bff90611bf3906001600160a01b0316610f1c565b6001600160401b031690565b60405163a3a124c360e01b81526001600160401b03909116600482015292839081906024820190565b03815f60026007609a1b015af1918215610491575f92611dc9575b508051611c5a90610f1c906001600160a01b031681565b916060820192611c7184516001600160801b031690565b90803b156100d8576040516340c10f1960e01b8152915f918391829084908290611c9f908960048401610aad565b03925af19081611db5575b50611d7e57611d5e611d507f92d91a50ae3561d4edd8eadad5f27f09116faaa4f733bd37682c49b4cbc20e3993611d43611ceb87516001600160801b031690565b82516001600160a01b03165f908152600260205260409020611d2990611d129088906103b6565b91611d2483546001600160801b031690565b611bb0565b6001600160801b03166001600160801b0319825416179055565b516001600160a01b031690565b93516001600160801b031690565b6040516001600160a01b03909216938291611d799183610aad565b0390a2565b90517fbc1cf3ff6e619587619408b396a13775509216474757afb9d29bda1a96f590f09190611d5e906001600160a01b0316611d50565b806104855f611dc3936104e5565b5f611caa565b611de391925060203d6020116117b3576117a581836104e5565b905f611c43565b61051b9392604092825260208201520190611a10565b5f908051604081115f14611f0c57505f611e2260209260405191828092611a10565b039060025afa156104915760205f611e9d610ef3611e918351965b6040519283917f363636363636363636363636363636363636363636363636363636363636363689187f36363636363636363636363636363636363636363636363636363636363636368b18898501611dea565b60405191828092611a10565b039060025afa1561049157611efc7f5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c611e915f93610ef36020968651908560405196879518911889850191606093918352602083015260408201520190565b039060025afa15610491575f5190565b6020808301519490821193509160018414611f7b57505f925b60208210611f65575b6040821016611f4b575b505f611e9d610ef3611e91602094611e3d565b600160409190910360031b1b5f190119909116905f611f38565b935f1960018360200360031b1b01191693611f2e565b6040015192611f2556fea2646970667358221220f6f519214041f8eb6642319823eddd315e74250294bcf00394f183b11eff43ad64736f6c63430008230033", "nonce": "0x1" }, "0x1c00000000000000000000000000000000000002": { "balance": "0x0", - "code": "0x60806040526004361015610011575f80fd5b5f3560e01c80632c37826e14610194578063340652721461018f578063378fa8fa1461018a5780633d1c5a9314610185578063413e9cde1461018057806343c3cb831461017b57806348aa41081461017657806353a8d73914610171578063545525f11461016c57806379502c551461016757806379fa3289146101625780637b9c9aa41461015d57806386f47e5514610158578063a3a124c314610153578063a94cd9311461014e578063b3b200aa14610149578063b9d1fd6814610144578063bba9282e1461013f578063c37fc8a81461013a578063c9b6ca9b14610135578063ce7025e914610130578063d93af1d21461012b578063e2e3ee5c146101265763f490ca9614610121575f80fd5b610d59565b610bb2565b610b95565b610b10565b610af4565b610a09565b610892565b61078f565b6106f7565b610665565b610577565b61055a565b61051d565b610389565b610303565b6102e0565b6102c4565b61026a565b61024f565b610226565b610206565b6101eb565b6101c6565b6101a7565b5f9103126101a357565b5f80fd5b346101a3575f3660031901126101a35760205f5460c01c604051908152f35b346101a3575f3660031901126101a35760206001600160801b035f5416604051908152f35b346101a3575f3660031901126101a357602060405160218152f35b346101a3575f3660031901126101a357602060045460c01c604051908152f35b346101a3575f3660031901126101a35760206001600160401b0360045460801c16604051908152f35b346101a3575f3660031901126101a357602060405160718152f35b346101a3575f3660031901126101a3575f602060405161028981610d8f565b82815201526040805161029b81610d8f565b6001600160401b0360015491828152602082600254169101908152835192835251166020820152f35b346101a3575f3660031901126101a35760206040516104008152f35b346101a3575f3660031901126101a357602063ffffffff60045416604051908152f35b346101a3575f3660031901126101a3576040517f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03168152602090f35b600435906001600160801b03821682036101a357565b604435906001600160801b03821682036101a357565b602435906001600160801b03821682036101a357565b346101a35760203660031901126101a3576103a2610347565b33151580610447575b61043857670de0b6b3a76400006001600160801b03821611610429576104248161040a7f6f864cce5237e12ffc9a99fc6c59af17222c2bbb3457690cc8753ab16b5d715e936001600160801b03166001600160801b03195f5416175f55565b6040516001600160801b0390911681529081906020820190565b0390a1005b630d62f21160e11b5f5260045ffd5b63bb62587160e01b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa9081156104d6575f916104a7575b506001600160a01b03163314156103ab565b6104c9915060203d6020116104cf575b6104c18183610dcb565b810190610e1d565b5f610495565b503d6104b7565b610e35565b600435906001600160401b03821682036101a357565b608435906001600160401b03821682036101a357565b602435906001600160401b03821682036101a357565b346101a35760203660031901126101a357602061054961053b6104db565b610544816114c0565b611502565b6001600160801b0360405191168152f35b346101a3575f3660031901126101a3576020604051629896808152f35b346101a35760203660031901126101a3576105906104db565b6007609a1b193301610618576001600160401b03165f818152600560205260409020546001600160a01b0316801561060957610605915f5260056020526105eb60405f206bffffffffffffffffffffffff60a01b8154169055565b6040516001600160a01b0390911681529081906020820190565b0390f35b63c29f0c7160e01b5f5260045ffd5b6303300c7360e31b5f5260045ffd5b6001600160a01b038116036101a357565b9181601f840112156101a3578235916001600160401b0383116101a357602083818601950101116101a357565b346101a35760e03660031901126101a35760043561068281610627565b6024359061068f82610627565b61069761035d565b916064356106a36104f1565b60a435916106b083610627565b60c435956001600160401b0387116101a3576106dd6106d66106f5983690600401610638565b3691610e5b565b94604051966106ed602089610dcb565b5f885261161a565b005b346101a3576101003660031901126101a35760043561071581610627565b60243561072181610627565b61072961035d565b916064356107356104f1565b9060a43561074281610627565b60c4356001600160401b0381116101a357610761903690600401610638565b93909260e435976001600160401b0389116101a3576107876106f5993690600401610638565b989097610ea5565b346101a35760203660031901126101a35760043563ffffffff811681036101a35733151580610813575b61043857610424816107fc7f5340f6cf6e1274bffd0c7188c75f885ed6c90cd6b0879a646290a92f84a6dce39363ffffffff1663ffffffff196004541617600455565b60405163ffffffff90911681529081906020820190565b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa9081156104d6575f91610873575b506001600160a01b03163314156107b9565b61088c915060203d6020116104cf576104c18183610dcb565b5f610861565b346101a3575f3660031901126101a35760206001600160401b035f5460801c16604051908152f35b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b602081016020825282518091526040820191602060408360051b8301019401925f915b83831061091057505050505090565b90919293946020806109fa600193603f1986820301875289519061093c81835160018060a01b03169052565b818401516001600160a01b031681850152604082810151908201526060808301516001600160a01b0316908201526080828101516001600160801b03169082015260a0828101516001600160801b03169082015260c082015160c08201526109b460e083015160e08301906001600160401b03169052565b610100828101516001600160401b0316908201526101406109e86101208401516101606101208501526101608401906108ba565b920151906101408184039101526108ba565b97019301930191939290610901565b346101a3575f3660031901126101a357600354610a2581610ecc565b90610a336040519283610dcb565b808252601f19610a4282610ecc565b015f5b818110610a965750505f5b818110610a65576040518061060585826108de565b80610a7a610a74600193610ef7565b5061101b565b610a848286610f31565b52610a8f8185610f31565b5001610a50565b602090604051610aa581610daf565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c08201525f60e08201525f6101008201526060610120820152606061014082015282828701015201610a45565b346101a3575f3660031901126101a357602060405161c3508152f35b346101a35760603660031901126101a357610b29610507565b604435906001600160401b0382116101a357366023830112156101a3578160040135906001600160401b0382116101a3573660248360051b850101116101a357610b7c610b859260246106059501611123565b90600435611cb4565b6040519081529081906020820190565b346101a3575f3660031901126101a3576020600354604051908152f35b346101a35760603660031901126101a357600435610bcf81610627565b610bd7610373565b90604435610be481610627565b6007609a1b193301610618576001600160401b037f34ca953f3eed14157d2f660c7e92a5bd9c05be0d61a188830f3bf1cb7d094f9691610d545f95610c9c610c2a610dec565b6001600160a01b038816815260208101899052604081018990526001600160a01b03851660608201526001600160801b03831660808201528860a08201528860c08201528860e082015288610100820152610c83610e91565b610120820152610c91610e91565b6101408201526112e3565b865460801c6001600160401b031692610ce3610cb78561149e565b5f805467ffffffffffffffff60801b191660809290921b67ffffffffffffffff60801b16919091179055565b604080516001600160a01b0398891681529790911660208801526001600160801b03909116908601525f606086018190526080860181905260a0860181905260c0860181905261012060e0870181905286018190526101406101008701819052860152911692908190610160820190565b0390a3005b346101a3575f3660031901126101a3576020604051670de0b6b3a76400008152f35b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b03821117610daa57604052565b610d7b565b61016081019081106001600160401b03821117610daa57604052565b90601f801991011681019081106001600160401b03821117610daa57604052565b60405190610dfc61016083610dcb565b565b60405190610dfc61014083610dcb565b60405190610dfc604083610dcb565b908160209103126101a35751610e3281610627565b90565b6040513d5f823e3d90fd5b6001600160401b038111610daa57601f01601f191660200190565b929192610e6782610e40565b91610e756040519384610dcb565b8294818452818301116101a3578281602093845f960137010152565b60405190610ea0602083610dcb565b5f8252565b97610ebe610ec6929394959697610dfc9b993691610e5b565b973691610e5b565b9661161a565b6001600160401b038111610daa5760051b60200190565b634e487b7160e01b5f52603260045260245ffd5b600354811015610f135760035f52600960205f20910201905f90565b610ee3565b8054821015610f13575f52600960205f20910201905f90565b8051821015610f135760209160051b010190565b90600182811c92168015610f73575b6020831014610f5f57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610f54565b9060405191825f825492610f9084610f45565b8084529360018116908115610ff95750600114610fb5575b50610dfc92500383610dcb565b90505f9291925260205f20905f915b818310610fdd575050906020610dfc928201015f610fa8565b6020919350806001915483858901015201910190918492610fc4565b905060209250610dfc94915060ff191682840152151560051b8201015f610fa8565b9061111b6008611029610dec565b84546001600160a01b031681529360018101546001600160a01b031660208601526002810154604086015260038101546001600160a01b031660608601526110ab61109b6004830154611095611085826001600160801b031690565b6001600160801b031660808a0152565b60801c90565b6001600160801b031660a0870152565b600581015460c08601526111036110f260068301546110e36110d3826001600160401b031690565b6001600160401b031660e08a0152565b60401c6001600160401b031690565b6001600160401b0316610100870152565b61110f60078201610f7d565b61012086015201610f7d565b610140830152565b9061112d81610ecc565b9161113b6040519384610dcb565b818352602083019160051b8101903682116101a35780925b828410611161575050505090565b83356001600160401b0381116101a357820136601f820112156101a357602091611192839236908481359101610e5b565b815201930192611153565b634e487b7160e01b5f525f60045260245ffd5b5f5b8281106111be57505050565b5f828201556001016111b2565b91601f82116111d957505050565b8082116111e557505050565b610dfc925f5260205f20916020601f830160051c9210611210575b601f82910160051c0391016111b0565b5f9150611200565b91909182516001600160401b038111610daa5761123f816112398454610f45565b846111cb565b6020601f821160011461127e57819061126f9394955f92611273575b50508160011b915f199060031b1c19161790565b9055565b015190505f8061125b565b601f19821690611291845f5260205f2090565b915f5b8181106112cb575095836001959697106112b3575b505050811b019055565b01515f1960f88460031b161c191690555f80806112a9565b9192602060018192868b015181550194019201611294565b60035468010000000000000000811015610daa5780600161130992016003556003610f18565b61148557815181546001600160a01b0319166001600160a01b03909116178155610dfc916008906101409060208101516001850180546001600160a01b0319166001600160a01b039092169190911790556040810151600285015560608101516003850180546001600160a01b0319166001600160a01b039092169190911790556113f2600485016113c46113a860808501516001600160801b031690565b82546001600160801b0319166001600160801b03909116178255565b60a08301516001600160801b031681546001600160801b031660809190911b6001600160801b031916179055565b60c0810151600585015561146a6006850161143761141a60e08501516001600160401b031690565b825467ffffffffffffffff19166001600160401b03909116178255565b61010083015181546fffffffffffffffff0000000000000000191660409190911b67ffffffffffffffff60401b16179055565b61147c61012082015160078601611218565b01519101611218565b61119d565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03166001600160401b0381146114bb5760010190565b61148a565b6001600160401b03629896809116116114d557565b637d2e4eb560e01b5f5260045ffd5b6001600160401b036001911601906001600160401b0382116114bb57565b6001600160401b031661c350016001600160401b0381116114bb576001600160401b036001600160801b035f54169116026001600160801b0381169081036114bb5790565b908160209103126101a3575180151581036101a35790565b63ffffffff1663ffffffff81146114bb5760010190565b906001600160801b03809116911601906001600160801b0382116114bb57565b908160209103126101a3575190565b6001600160a01b039182168152911660208201526001600160801b0391821660408201529116606082015260808101919091526001600160401b0391821660a0820152911660c082015261012060e08201819052610e3293919261160b918401906108ba565b916101008184039101526108ba565b95969092949693919360018060a01b038816156106095760405163037d635760e31b81526001600160a01b0388166004820152602081806024810103817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa9081156104d6575f91611aa2575b5015611a93576116a0836114c0565b610400815111611a84576116b38261205d565b60045463ffffffff811661198e575b506116cc83611502565b976116d78987611576565b60405163868a2e9d60e01b8152979094906020896004815f60056007609a1b015af19889156104d6575f9961195d575b50881561194e576040516323b872dd60e01b81523360048201523060248201526001600160801b03871660448201526001600160a01b038b16906020816064815f865af19081156104d6575f9161191f575b501561191057803b156101a357604051630852cd8d60e31b81526001600160801b039790971660048801525f908790602490829084905af180156104d6577f34ca953f3eed14157d2f660c7e92a5bd9c05be0d61a188830f3bf1cb7d094f96996118f1976118be926118f6575b506118386117de6117d960045460c01c90565b61149e565b600480546001600160c01b031660c083901b6001600160c01b03191617905595611819876001600160401b03165f52600560205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b611840610dec565b6001600160a01b038d1681529033602083015260408201526001600160a01b03891660608201526001600160801b038a1660808201526001600160801b038d1660a082015260c081018390526001600160401b03841660e08201526001600160401b03851661010082015285610120820152866101408201526112e3565b5f5460801c6001600160401b03169a6118d9610cb78d61149e565b6040519889986001600160401b03339e169c8a6115a5565b0390a3565b806119045f61190a93610dcb565b80610199565b5f6117c6565b6312171d8360e31b5f5260045ffd5b611941915060203d602011611947575b6119398183610dcb565b810190611547565b5f611759565b503d61192f565b632968ee7f60e21b5f5260045ffd5b61198091995060203d602011611987575b6119788183610dcb565b810190611596565b975f611707565b503d61196e565b6119bb6119af6001600160401b034316926001600160401b039060401c1690565b6001600160401b031690565b8103611a3b575b506004546119ea6119e1602083901c63ffffffff169263ffffffff1690565b63ffffffff1690565b63ffffffff82161015611a2c57611a03611a269161155f565b67ffffffff000000006004549160201b169067ffffffff00000000191617600455565b5f6116c2565b63124ab48560e11b5f5260045ffd5b611a689067ffffffffffffffff60401b6004549160401b169067ffffffffffffffff60401b191617600455565b611a7e67ffffffff000000001960045416600455565b5f6119c2565b634b8a874d60e11b5f5260045ffd5b631fcf8c4760e11b5f5260045ffd5b611abb915060203d602011611947576119398183610dcb565b5f611691565b5f198101919082116114bb57565b604080825282516001600160a01b031690820152929190602090611b949080830151606087015260408101516001600160a01b0316608087015260608101516001600160801b031660a087015260808101516001600160801b031660c087015260a081015160e087015260c08101516001600160401b031661010087015260e08101516001600160401b0316610120870152610120611b7f610100830151610140808a01526101808901906108ba565b910151868203603f19016101608801526108ba565b930152565b611ba38154610f45565b9081611bad575050565b81601f5f9311600114611bbe575055565b81835260208320611bdb91601f0160051c841901906001016111b0565b808252602082209081548360011b9084198560031b1c191617905555565b90611485576008815f610dfc93555f60018201555f60028201555f60038201555f60048201555f60058201555f6006820155611c3760078201611b99565b01611b99565b6003545f60035580611c4c5750565b806009029060098204036114bb5760035f5260205f205f5b828110611c7057505050565b80611cae600860099385015f81555f60018201555f60028201555f60038201555f60048201555f60058201555f6006820155611c3760078201611b99565b01611c64565b9092915f9333151580611fde575b610438576001600160401b03804316911603611fcf57600354808303611fb857508051828103611fa1575081611ddf575b5050611d2f611d0b611d065f5460c01c90565b6114e4565b5f80546001600160c01b031660c09290921b6001600160c01b031916919091179055565b817fec4aff46c65f485f4b15e3c2edadda1d57d002995f5aa262a27c76b9a680ec16611dda611d5f5f5460c01c90565b611d9a611d6a610e0e565b8581526001600160401b038316602090910181905260018690556002805467ffffffffffffffff19169091179055565b6004805467ffffffffffffffff60801b19164260801b67ffffffffffffffff60801b161790556040516001600160401b0390911681529081906020820190565b0390a2565b5f19935090805b611dfb575050611df4611c3d565b5f80611cf3565b611e0481611ac1565b93611e0e85610ef7565b50611e189061101b565b611e228685610f31565b518061014083015190611e34916120b9565b8151602080840151604080860151905160609290921b6bffffffffffffffffffffffff191692820192835260348083019190915281526001600160a01b039092169391611e82605482610dcb565b51902060608201519091906001600160a01b031660808201516001600160801b031660a08301516001600160801b031660c08401519160e0850151611ecd906001600160401b031690565b93610100860151611ee4906001600160401b031690565b95610120015196611ef3610dfe565b6001600160a01b03909a168a5260208a01526001600160a01b031660408901526001600160801b031660608801526001600160801b0316608087015260a08601526001600160401b031660c08501526001600160401b031660e084015261010083015261012082015260405180916020820193611f709185611acf565b03601f1981018252611f829082610dcb565b51902093611f8f90610ef7565b611f9891611bf9565b5f190180611de6565b630db2128560e11b5f52600452602482905260445ffd5b6324a839db60e11b5f52600483905260245260445ffd5b631391e11b60e21b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa9081156104d6575f9161203e575b506001600160a01b0316331415611cc2565b612057915060203d6020116104cf576104c18183610dcb565b5f61202c565b805180156120b5576021036120a657805115610f1357602081015161208c906120889060f81c6120ea565b1590565b6120a65761208860216120a0920151612155565b6120a657565b6361d0136b60e11b5f5260045ffd5b5050565b516120e2575f905b518181036120cd575050565b63521a2d4d60e11b5f5260045260245260445ffd5b6071906120c1565b60ff16600281149081156120fc575090565b600391501490565b3d1561212e573d9061211582610e40565b916121236040519384610dcb565b82523d5f602084013e565b606090565b602081519101519060208110612147575090565b5f199060200360031b1b1690565b80158015612201575b6121f0575f9081906401000003d0199060079082908181800909086040805160208082018181529282018190526060820152608081019290925263800001e9600160ff1b0360a08301526401000003d01960c0808401919091528252906121c660e082610dcb565b519060055afa6121d4612104565b901580156121f5575b6121f0576121ec600191612133565b1490565b505f90565b506020815114156121dd565b506401000003d01981101561215e56fea2646970667358221220d855b69618f7485e631398abf6924b972776d50caf4b79fbd48ef7d493bb048f64736f6c63430008230033", + "code": "0x60806040526004361015610011575f80fd5b5f3560e01c80632c37826e14610194578063340652721461018f578063378fa8fa1461018a5780633d1c5a9314610185578063413e9cde1461018057806343c3cb831461017b57806348aa41081461017657806353a8d73914610171578063545525f11461016c57806379502c551461016757806379fa3289146101625780637b9c9aa41461015d57806386f47e5514610158578063a3a124c314610153578063a94cd9311461014e578063b3b200aa14610149578063b9d1fd6814610144578063bba9282e1461013f578063c37fc8a81461013a578063c9b6ca9b14610135578063ce7025e914610130578063d93af1d21461012b578063e2e3ee5c146101265763f490ca9614610121575f80fd5b610d59565b610bb2565b610b95565b610b10565b610af4565b610a09565b610892565b61078f565b6106f7565b610665565b610577565b61055a565b61051d565b610389565b610303565b6102e0565b6102c4565b61026a565b61024f565b610226565b610206565b6101eb565b6101c6565b6101a7565b5f9103126101a357565b5f80fd5b346101a3575f3660031901126101a35760205f5460c01c604051908152f35b346101a3575f3660031901126101a35760206001600160801b035f5416604051908152f35b346101a3575f3660031901126101a357602060405160218152f35b346101a3575f3660031901126101a357602060045460c01c604051908152f35b346101a3575f3660031901126101a35760206001600160401b0360045460801c16604051908152f35b346101a3575f3660031901126101a357602060405160718152f35b346101a3575f3660031901126101a3575f602060405161028981610d8f565b82815201526040805161029b81610d8f565b6001600160401b0360015491828152602082600254169101908152835192835251166020820152f35b346101a3575f3660031901126101a35760206040516104008152f35b346101a3575f3660031901126101a357602063ffffffff60045416604051908152f35b346101a3575f3660031901126101a3576040517f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03168152602090f35b600435906001600160801b03821682036101a357565b604435906001600160801b03821682036101a357565b602435906001600160801b03821682036101a357565b346101a35760203660031901126101a3576103a2610347565b33151580610447575b61043857670de0b6b3a76400006001600160801b03821611610429576104248161040a7f6f864cce5237e12ffc9a99fc6c59af17222c2bbb3457690cc8753ab16b5d715e936001600160801b03166001600160801b03195f5416175f55565b6040516001600160801b0390911681529081906020820190565b0390a1005b630d62f21160e11b5f5260045ffd5b63bb62587160e01b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa9081156104d6575f916104a7575b506001600160a01b03163314156103ab565b6104c9915060203d6020116104cf575b6104c18183610dcb565b810190610e1d565b5f610495565b503d6104b7565b610e35565b600435906001600160401b03821682036101a357565b608435906001600160401b03821682036101a357565b602435906001600160401b03821682036101a357565b346101a35760203660031901126101a357602061054961053b6104db565b610544816114c0565b611502565b6001600160801b0360405191168152f35b346101a3575f3660031901126101a3576020604051629896808152f35b346101a35760203660031901126101a3576105906104db565b6007609a1b193301610618576001600160401b03165f818152600560205260409020546001600160a01b0316801561060957610605915f5260056020526105eb60405f206bffffffffffffffffffffffff60a01b8154169055565b6040516001600160a01b0390911681529081906020820190565b0390f35b63c29f0c7160e01b5f5260045ffd5b6303300c7360e31b5f5260045ffd5b6001600160a01b038116036101a357565b9181601f840112156101a3578235916001600160401b0383116101a357602083818601950101116101a357565b346101a35760e03660031901126101a35760043561068281610627565b6024359061068f82610627565b61069761035d565b916064356106a36104f1565b60a435916106b083610627565b60c435956001600160401b0387116101a3576106dd6106d66106f5983690600401610638565b3691610e5b565b94604051966106ed602089610dcb565b5f885261161a565b005b346101a3576101003660031901126101a35760043561071581610627565b60243561072181610627565b61072961035d565b916064356107356104f1565b9060a43561074281610627565b60c4356001600160401b0381116101a357610761903690600401610638565b93909260e435976001600160401b0389116101a3576107876106f5993690600401610638565b989097610ea5565b346101a35760203660031901126101a35760043563ffffffff811681036101a35733151580610813575b61043857610424816107fc7f5340f6cf6e1274bffd0c7188c75f885ed6c90cd6b0879a646290a92f84a6dce39363ffffffff1663ffffffff196004541617600455565b60405163ffffffff90911681529081906020820190565b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa9081156104d6575f91610873575b506001600160a01b03163314156107b9565b61088c915060203d6020116104cf576104c18183610dcb565b5f610861565b346101a3575f3660031901126101a35760206001600160401b035f5460801c16604051908152f35b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b602081016020825282518091526040820191602060408360051b8301019401925f915b83831061091057505050505090565b90919293946020806109fa600193603f1986820301875289519061093c81835160018060a01b03169052565b818401516001600160a01b031681850152604082810151908201526060808301516001600160a01b0316908201526080828101516001600160801b03169082015260a0828101516001600160801b03169082015260c082015160c08201526109b460e083015160e08301906001600160401b03169052565b610100828101516001600160401b0316908201526101406109e86101208401516101606101208501526101608401906108ba565b920151906101408184039101526108ba565b97019301930191939290610901565b346101a3575f3660031901126101a357600354610a2581610ecc565b90610a336040519283610dcb565b808252601f19610a4282610ecc565b015f5b818110610a965750505f5b818110610a65576040518061060585826108de565b80610a7a610a74600193610ef7565b5061101b565b610a848286610f31565b52610a8f8185610f31565b5001610a50565b602090604051610aa581610daf565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c08201525f60e08201525f6101008201526060610120820152606061014082015282828701015201610a45565b346101a3575f3660031901126101a357602060405161c3508152f35b346101a35760603660031901126101a357610b29610507565b604435906001600160401b0382116101a357366023830112156101a3578160040135906001600160401b0382116101a3573660248360051b850101116101a357610b7c610b859260246106059501611123565b90600435611cb4565b6040519081529081906020820190565b346101a3575f3660031901126101a3576020600354604051908152f35b346101a35760603660031901126101a357600435610bcf81610627565b610bd7610373565b90604435610be481610627565b6007609a1b193301610618576001600160401b037f34ca953f3eed14157d2f660c7e92a5bd9c05be0d61a188830f3bf1cb7d094f9691610d545f95610c9c610c2a610dec565b6001600160a01b038816815260208101899052604081018990526001600160a01b03851660608201526001600160801b03831660808201528860a08201528860c08201528860e082015288610100820152610c83610e91565b610120820152610c91610e91565b6101408201526112e3565b865460801c6001600160401b031692610ce3610cb78561149e565b5f805467ffffffffffffffff60801b191660809290921b67ffffffffffffffff60801b16919091179055565b604080516001600160a01b0398891681529790911660208801526001600160801b03909116908601525f606086018190526080860181905260a0860181905260c0860181905261012060e0870181905286018190526101406101008701819052860152911692908190610160820190565b0390a3005b346101a3575f3660031901126101a3576020604051670de0b6b3a76400008152f35b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b03821117610daa57604052565b610d7b565b61016081019081106001600160401b03821117610daa57604052565b90601f801991011681019081106001600160401b03821117610daa57604052565b60405190610dfc61016083610dcb565b565b60405190610dfc61014083610dcb565b60405190610dfc604083610dcb565b908160209103126101a35751610e3281610627565b90565b6040513d5f823e3d90fd5b6001600160401b038111610daa57601f01601f191660200190565b929192610e6782610e40565b91610e756040519384610dcb565b8294818452818301116101a3578281602093845f960137010152565b60405190610ea0602083610dcb565b5f8252565b97610ebe610ec6929394959697610dfc9b993691610e5b565b973691610e5b565b9661161a565b6001600160401b038111610daa5760051b60200190565b634e487b7160e01b5f52603260045260245ffd5b600354811015610f135760035f52600960205f20910201905f90565b610ee3565b8054821015610f13575f52600960205f20910201905f90565b8051821015610f135760209160051b010190565b90600182811c92168015610f73575b6020831014610f5f57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610f54565b9060405191825f825492610f9084610f45565b8084529360018116908115610ff95750600114610fb5575b50610dfc92500383610dcb565b90505f9291925260205f20905f915b818310610fdd575050906020610dfc928201015f610fa8565b6020919350806001915483858901015201910190918492610fc4565b905060209250610dfc94915060ff191682840152151560051b8201015f610fa8565b9061111b6008611029610dec565b84546001600160a01b031681529360018101546001600160a01b031660208601526002810154604086015260038101546001600160a01b031660608601526110ab61109b6004830154611095611085826001600160801b031690565b6001600160801b031660808a0152565b60801c90565b6001600160801b031660a0870152565b600581015460c08601526111036110f260068301546110e36110d3826001600160401b031690565b6001600160401b031660e08a0152565b60401c6001600160401b031690565b6001600160401b0316610100870152565b61110f60078201610f7d565b61012086015201610f7d565b610140830152565b9061112d81610ecc565b9161113b6040519384610dcb565b818352602083019160051b8101903682116101a35780925b828410611161575050505090565b83356001600160401b0381116101a357820136601f820112156101a357602091611192839236908481359101610e5b565b815201930192611153565b634e487b7160e01b5f525f60045260245ffd5b5f5b8281106111be57505050565b5f828201556001016111b2565b91601f82116111d957505050565b8082116111e557505050565b610dfc925f5260205f20916020601f830160051c9210611210575b601f82910160051c0391016111b0565b5f9150611200565b91909182516001600160401b038111610daa5761123f816112398454610f45565b846111cb565b6020601f821160011461127e57819061126f9394955f92611273575b50508160011b915f199060031b1c19161790565b9055565b015190505f8061125b565b601f19821690611291845f5260205f2090565b915f5b8181106112cb575095836001959697106112b3575b505050811b019055565b01515f1960f88460031b161c191690555f80806112a9565b9192602060018192868b015181550194019201611294565b60035468010000000000000000811015610daa5780600161130992016003556003610f18565b61148557815181546001600160a01b0319166001600160a01b03909116178155610dfc916008906101409060208101516001850180546001600160a01b0319166001600160a01b039092169190911790556040810151600285015560608101516003850180546001600160a01b0319166001600160a01b039092169190911790556113f2600485016113c46113a860808501516001600160801b031690565b82546001600160801b0319166001600160801b03909116178255565b60a08301516001600160801b031681546001600160801b031660809190911b6001600160801b031916179055565b60c0810151600585015561146a6006850161143761141a60e08501516001600160401b031690565b825467ffffffffffffffff19166001600160401b03909116178255565b61010083015181546fffffffffffffffff0000000000000000191660409190911b67ffffffffffffffff60401b16179055565b61147c61012082015160078601611218565b01519101611218565b61119d565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03166001600160401b0381146114bb5760010190565b61148a565b6001600160401b03629896809116116114d557565b637d2e4eb560e01b5f5260045ffd5b6001600160401b036001911601906001600160401b0382116114bb57565b6001600160401b031661c350016001600160401b0381116114bb576001600160401b036001600160801b035f54169116026001600160801b0381169081036114bb5790565b908160209103126101a3575180151581036101a35790565b63ffffffff1663ffffffff81146114bb5760010190565b906001600160801b03809116911601906001600160801b0382116114bb57565b908160209103126101a3575190565b6001600160a01b039182168152911660208201526001600160801b0391821660408201529116606082015260808101919091526001600160401b0391821660a0820152911660c082015261012060e08201819052610e3293919261160b918401906108ba565b916101008184039101526108ba565b95969092949693919360018060a01b038816156106095760405163037d635760e31b81526001600160a01b0388166004820152602081806024810103817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa9081156104d6575f91611aa2575b5015611a93576116a0836114c0565b610400815111611a84576116b38261205d565b60045463ffffffff811661198e575b506116cc83611502565b976116d78987611576565b60405163868a2e9d60e01b8152979094906020896004815f60056007609a1b015af19889156104d6575f9961195d575b50881561194e576040516323b872dd60e01b81523360048201523060248201526001600160801b03871660448201526001600160a01b038b16906020816064815f865af19081156104d6575f9161191f575b501561191057803b156101a357604051630852cd8d60e31b81526001600160801b039790971660048801525f908790602490829084905af180156104d6577f34ca953f3eed14157d2f660c7e92a5bd9c05be0d61a188830f3bf1cb7d094f96996118f1976118be926118f6575b506118386117de6117d960045460c01c90565b61149e565b600480546001600160c01b031660c083901b6001600160c01b03191617905595611819876001600160401b03165f52600560205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b611840610dec565b6001600160a01b038d1681529033602083015260408201526001600160a01b03891660608201526001600160801b038a1660808201526001600160801b038d1660a082015260c081018390526001600160401b03841660e08201526001600160401b03851661010082015285610120820152866101408201526112e3565b5f5460801c6001600160401b03169a6118d9610cb78d61149e565b6040519889986001600160401b03339e169c8a6115a5565b0390a3565b806119045f61190a93610dcb565b80610199565b5f6117c6565b6312171d8360e31b5f5260045ffd5b611941915060203d602011611947575b6119398183610dcb565b810190611547565b5f611759565b503d61192f565b632968ee7f60e21b5f5260045ffd5b61198091995060203d602011611987575b6119788183610dcb565b810190611596565b975f611707565b503d61196e565b6119bb6119af6001600160401b034316926001600160401b039060401c1690565b6001600160401b031690565b8103611a3b575b506004546119ea6119e1602083901c63ffffffff169263ffffffff1690565b63ffffffff1690565b63ffffffff82161015611a2c57611a03611a269161155f565b67ffffffff000000006004549160201b169067ffffffff00000000191617600455565b5f6116c2565b63124ab48560e11b5f5260045ffd5b611a689067ffffffffffffffff60401b6004549160401b169067ffffffffffffffff60401b191617600455565b611a7e67ffffffff000000001960045416600455565b5f6119c2565b634b8a874d60e11b5f5260045ffd5b631fcf8c4760e11b5f5260045ffd5b611abb915060203d602011611947576119398183610dcb565b5f611691565b5f198101919082116114bb57565b604080825282516001600160a01b031690820152929190602090611b949080830151606087015260408101516001600160a01b0316608087015260608101516001600160801b031660a087015260808101516001600160801b031660c087015260a081015160e087015260c08101516001600160401b031661010087015260e08101516001600160401b0316610120870152610120611b7f610100830151610140808a01526101808901906108ba565b910151868203603f19016101608801526108ba565b930152565b611ba38154610f45565b9081611bad575050565b81601f5f9311600114611bbe575055565b81835260208320611bdb91601f0160051c841901906001016111b0565b808252602082209081548360011b9084198560031b1c191617905555565b90611485576008815f610dfc93555f60018201555f60028201555f60038201555f60048201555f60058201555f6006820155611c3760078201611b99565b01611b99565b6003545f60035580611c4c5750565b806009029060098204036114bb5760035f5260205f205f5b828110611c7057505050565b80611cae600860099385015f81555f60018201555f60028201555f60038201555f60048201555f60058201555f6006820155611c3760078201611b99565b01611c64565b9092915f9333151580611fde575b610438576001600160401b03804316911603611fcf57600354808303611fb857508051828103611fa1575081611ddf575b5050611d2f611d0b611d065f5460c01c90565b6114e4565b5f80546001600160c01b031660c09290921b6001600160c01b031916919091179055565b817fec4aff46c65f485f4b15e3c2edadda1d57d002995f5aa262a27c76b9a680ec16611dda611d5f5f5460c01c90565b611d9a611d6a610e0e565b8581526001600160401b038316602090910181905260018690556002805467ffffffffffffffff19169091179055565b6004805467ffffffffffffffff60801b19164260801b67ffffffffffffffff60801b161790556040516001600160401b0390911681529081906020820190565b0390a2565b5f19935090805b611dfb575050611df4611c3d565b5f80611cf3565b611e0481611ac1565b93611e0e85610ef7565b50611e189061101b565b611e228685610f31565b518061014083015190611e34916120b9565b8151602080840151604080860151905160609290921b6bffffffffffffffffffffffff191692820192835260348083019190915281526001600160a01b039092169391611e82605482610dcb565b51902060608201519091906001600160a01b031660808201516001600160801b031660a08301516001600160801b031660c08401519160e0850151611ecd906001600160401b031690565b93610100860151611ee4906001600160401b031690565b95610120015196611ef3610dfe565b6001600160a01b03909a168a5260208a01526001600160a01b031660408901526001600160801b031660608801526001600160801b0316608087015260a08601526001600160401b031660c08501526001600160401b031660e084015261010083015261012082015260405180916020820193611f709185611acf565b03601f1981018252611f829082610dcb565b51902093611f8f90610ef7565b611f9891611bf9565b5f190180611de6565b630db2128560e11b5f52600452602482905260445ffd5b6324a839db60e11b5f52600483905260245260445ffd5b631391e11b60e21b5f5260045ffd5b50604051630b83774760e31b81526020816004817f0000000000000000000000001c000000000000000000000000000000000000036001600160a01b03165afa9081156104d6575f9161203e575b506001600160a01b0316331415611cc2565b612057915060203d6020116104cf576104c18183610dcb565b5f61202c565b805180156120b5576021036120a657805115610f1357602081015161208c906120889060f81c6120ea565b1590565b6120a65761208860216120a0920151612155565b6120a657565b6361d0136b60e11b5f5260045ffd5b5050565b516120e2575f905b518181036120cd575050565b63521a2d4d60e11b5f5260045260245260445ffd5b6071906120c1565b60ff16600281149081156120fc575090565b600391501490565b3d1561212e573d9061211582610e40565b916121236040519384610dcb565b82523d5f602084013e565b606090565b602081519101519060208110612147575090565b5f199060200360031b1b1690565b80158015612201575b6121f0575f9081906401000003d0199060079082908181800909086040805160208082018181529282018190526060820152608081019290925263800001e9600160ff1b0360a08301526401000003d01960c0808401919091528252906121c660e082610dcb565b519060055afa6121d4612104565b901580156121f5575b6121f0576121ec600191612133565b1490565b505f90565b506020815114156121dd565b506401000003d01981101561215e56fea2646970667358221220c68790101d5f61770b0489b79167550634ed6fae99ba117ac6aa7f315f160e1564736f6c63430008230033", "nonce": "0x1" }, "0x1c00000000000000000000000000000000000003": { "balance": "0x0", - "code": "0x6080806040526004361015610012575f80fd5b5f3560e01c9081631beb1ab814610561575080631fbb25ad1461051d5780633488ce0d146102dd5780635c1bba381461023b5780636d46e98714610193578063a21de6d91461014f5763e202d99514610069575f80fd5b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260026024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d575b6040516001600160a01b039091168152602090f35b506020813d60201161013c575b816101276020938361067c565b8101031261013857602090516100f8565b5f80fd5b3d915061011a565b6040513d5f823e3d90fd5b34610138575f366003190112610138576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169081900361013857604051630b83774760e31b8152602081600481305afa908115610144575f916101f6575b506040516001600160a01b039091169091148152602090f35b90506020813d602011610233575b816102116020938361067c565b810103126101385751906001600160a01b0382168203610138579060206101dd565b3d9150610204565b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d576040516001600160a01b039091168152602090f35b34610138575f366003190112610138576040516381e3da6b60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038181166004840152600760248401527f0000000000000000000000001c00000000000000000000000000000000000000169190602082604481865afa918215610144575f926104e9575b5081156104da576040516020810190600782526020815261038f60408261067c565b519020915f1981019081116104c6578060011b90808204600214901517156104c65782018092116104c65760018201908183116104c6576040516381e3da6b60e01b81526001600160a01b03821660048201526024810193909352602083604481875afa928315610144575f9361048e575b506040516381e3da6b60e01b81526001600160a01b03909116600482015260248101919091529160209083908180604481015b03915afa918215610144575f92610459575b5060ff6040928351928352166020820152f35b91506020823d602011610486575b816104746020938361067c565b810103126101385790519060ff610446565b3d9150610467565b919092506020823d6020116104be575b816104ab6020938361067c565b8101031261013857905191610434610401565b3d915061049e565b634e487b7160e01b5f52601160045260245ffd5b630c322fb560e31b5f5260045ffd5b9091506020813d602011610515575b816105056020938361067c565b810103126101385751908361036d565b3d91506104f8565b34610138575f366003190112610138576040517f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169190829003610138576105fe9181602080930191825260086040820152604081526105ab60608261067c565b5190206040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152602481019190915291829081906044820190565b03817f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03165afa8015610144575f90610649575b60209060ff604051911615158152f35b506020813d602011610674575b816106636020938361067c565b810103126101385760209051610639565b3d9150610656565b90601f8019910116810190811067ffffffffffffffff82111761069e57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220fdb09622e8f7b1599cbada7d6552a3d891d6e220116c42bbb8308f891598515264736f6c63430008230033", + "code": "0x6080806040526004361015610012575f80fd5b5f3560e01c9081631beb1ab814610561575080631fbb25ad1461051d5780633488ce0d146102dd5780635c1bba381461023b5780636d46e98714610193578063a21de6d91461014f5763e202d99514610069575f80fd5b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260026024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d575b6040516001600160a01b039091168152602090f35b506020813d60201161013c575b816101276020938361067c565b8101031261013857602090516100f8565b5f80fd5b3d915061011a565b6040513d5f823e3d90fd5b34610138575f366003190112610138576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169081900361013857604051630b83774760e31b8152602081600481305afa908115610144575f916101f6575b506040516001600160a01b039091169091148152602090f35b90506020813d602011610233575b816102116020938361067c565b810103126101385751906001600160a01b0382168203610138579060206101dd565b3d9150610204565b34610138575f366003190112610138576040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f6024830152602090829060449082907f0000000000000000000000001c00000000000000000000000000000000000000165afa8015610144575f9061010d576040516001600160a01b039091168152602090f35b34610138575f366003190112610138576040516381e3da6b60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038181166004840152600760248401527f0000000000000000000000001c00000000000000000000000000000000000000169190602082604481865afa918215610144575f926104e9575b5081156104da576040516020810190600782526020815261038f60408261067c565b519020915f1981019081116104c6578060011b90808204600214901517156104c65782018092116104c65760018201908183116104c6576040516381e3da6b60e01b81526001600160a01b03821660048201526024810193909352602083604481875afa928315610144575f9361048e575b506040516381e3da6b60e01b81526001600160a01b03909116600482015260248101919091529160209083908180604481015b03915afa918215610144575f92610459575b5060ff6040928351928352166020820152f35b91506020823d602011610486575b816104746020938361067c565b810103126101385790519060ff610446565b3d9150610467565b919092506020823d6020116104be575b816104ab6020938361067c565b8101031261013857905191610434610401565b3d915061049e565b634e487b7160e01b5f52601160045260245ffd5b630c322fb560e31b5f5260045ffd5b9091506020813d602011610515575b816105056020938361067c565b810103126101385751908361036d565b3d91506104f8565b34610138575f366003190112610138576040517f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03168152602090f35b34610138576020366003190112610138576004356001600160a01b0381169190829003610138576105fe9181602080930191825260086040820152604081526105ab60608261067c565b5190206040516381e3da6b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152602481019190915291829081906044820190565b03817f0000000000000000000000001c000000000000000000000000000000000000006001600160a01b03165afa8015610144575f90610649575b60209060ff604051911615158152f35b506020813d602011610674575b816106636020938361067c565b810103126101385760209051610639565b3d9150610656565b90601f8019910116810190811067ffffffffffffffff82111761069e57604052565b634e487b7160e01b5f52604160045260245ffdfea264697066735822122039ec3117ef662b18ae690388d968b8f23fbb9cf47f4192242a1da2dc095aae1264736f6c63430008230033", "nonce": "0x1" }, "0x20c0000000000000000000000000000000000000": { @@ -138,5 +138,5 @@ "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x42", "timestamp": "0x0", - "zoneFactoryBytecode": "0x60808060405234610138575f805463ffffffff191660011781556003600755600680546001600160a01b03191633908117909155907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36101a28181016001600160401b03811183821017610124578291614c96833903905ff08015610119576001600160a01b03165f8181526003602052604090819020805460ff19166001179055600480546001600160a01b031916909217909155516105a2808201906001600160401b03821183831017610124576020918391614e3883393081520301905ff0801561011957600580546001600160a01b0319166001600160a01b0392909216919091179055604051614b59908161013d8239f35b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301b290d314610edc575080632b7ac3f314610eb45780632d45796a146104815780633cb747bf1461045857806374134d371461043a57806376628f83146103f85780638da5cb5b146103cf57806390b7f6fd14610174578063eee83499146101275763f2fde38b1461008c575f80fd5b34610124576020366003190112610124576004356001600160a01b03811690819003610122576006546001600160a01b0381169033829003610113578215610104576001600160a01b03191682176006557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6349e27cff60e01b8452600484fd5b6330cd747160e01b8452600484fd5b505b80fd5b50346101245780600319360112610124575f1963ffffffff825416019063ffffffff82116101605760208263ffffffff60405191168152f35b634e487b7160e01b81526011600452602490fd5b50346101245760203660031901126101245760043563ffffffff81168091036101225760606101206040516101a881610f2e565b84815284602082015284604082015284838201528460808201528460a08201528460c08201528460e0820152846101008201520152815260016020526040812090604051906101f682610f2e565b825463ffffffff811683526001600160a01b03602091821c811691840191825260018501548116604080860191825260028701548316606087019081526003880154841660808801908152600489015490941660a08801908152600589015460c0890190815260068a015460e08a0190815260078b01546001600160401b03166101008b0190815294516008909b018054989b989597919692959394919391929189918b91906102a582610fb1565b80855291600181169081156103b15750600114610377575b5050036102ca9089610f4a565b6101208a81019889526040805160208082529c5163ffffffff168d8201529c516001600160a01b03908116918e01919091529151821660608d01529151811660808c01529151821660a08b015291511660c0890152905160e0880152905161010087015290516001600160401b031690850152516101408085015280516101608501819052849390929183910161018085015e8183016101800152601f1990601f01168101036101800190f35b8c5260208c208c92505b81831061039657505081016020015f806102bd565b80602092948385600194549201015201910190918a92610381565b9150506020925060ff191682840152151560051b8201015f806102bd565b50346101245780600319360112610124576006546040516001600160a01b039091168152602090f35b5034610124576020366003190112610124576004356001600160a01b038116908190036101225760408260ff9260209452600384522054166040519015158152f35b5034610124578060031936011261012457602060405162e4e1c08152f35b50346101245780600319360112610124576005546040516001600160a01b039091168152602090f35b5034610c3c576020366003190112610c3c576001600160401b0360043511610c3c5761010060043536036003190112610c3c576006546001600160a01b03163303610ea5576104d4600435600401610f1a565b6040516335ec42c960e01b81526001600160a01b03909116600482015260208160248161083f60921b5afa908115610c31575f91610e6a575b5015610e5b576001600160a01b03610529600435602401610f1a565b1615610e4c576001600160a01b03610545600435604401610f1a565b1615610e3d576001600160a01b03610561600435606401610f1a565b165f52600360205260ff60405f20541615610e2e5762e4e1c05a10610e1f575f5463ffffffff80821614610e1057600163ffffffff82160163ffffffff8111610dfc5763ffffffff1663ffffffff198216175f5560075460018101808211610dfc57600755606081610c54575050604051606b60f91b6020820152602560fa1b60218201523060601b6022820152600160ff1b603682015260178152610608603782610f4a565b60018060a01b03906020815191012016604051613b3a8082018281106001600160401b03821117610c40578291610fea833903905ff0908115610c3157610653600435600401610f1a565b6005546001600160a01b031661066d600435602401610f1a565b61067b604460043501610f1a565b610689606460043501610f1a565b9061069860c460043501610f6b565b926106ad60e460043501600435600401610f7f565b91906001600160a01b038a163b15610c3c576001600160401b0363ffffffff96610144968d9686955f9b6040519d8e9c8d9b633fd2490760e01b8d521660048c015260018060a01b031660248b015260448a015260018060a01b0316606489015260018060a01b0316608488015260018060a01b031660a48701526084600435013560c48701521660e485015261012061010485015281610124850152848401378181018301859052601f01601f19168101030181836001600160a01b0388165af18015610c3157610c1c575b506001600160a01b03821603610bc057610798600435600401610f1a565b6107a6602460043501610f1a565b6107b4604460043501610f1a565b906001600160401b036107cb606460043501610f1a565b6107d960c460043501610f6b565b906107ee60e460043501600435600401610f7f565b959094604051976107fe89610f2e565b63ffffffff8b1689526001600160a01b038a811660208b015290811660408a0152908116606089015290811660808801521660a0860152600435608481013560c087015260a4013560e0860152166101008401526001600160401b038211610ba85785906040519261087a6020601f19601f8401160185610f4a565b8084523681830111610bbc57806020928386013783010152610120820190815263ffffffff848116865260016020818152604080892086518154848901516001600160c01b031990911691909616179490921b640100000000600160c01b03169390931781559184015190820180546001600160a01b03199081166001600160a01b0393841617909155606085015160028401805483169184169190911790556080850151600384018054831691841691909117905560a0850151600484018054909216921691909117905560c0830151600582015560e083015160068201556101009092015160078301805467ffffffffffffffff19166001600160401b0392831617905590518051918211610ba8576109986008840154610fb1565b601f8111610b53575b50602090601f8311600114610ae257828793604098936008938a979592610ad7575b50508160011b915f199060031b1c1916179101555b6001600160a01b0383168152600260205220805460ff19166001179055610a026004803501610f1a565b6001600160401b03610a18602460043501610f1a565b610a26604460043501610f1a565b610a34606460043501610f1a565b90610a4360c460043501610f6b565b88516001600160a01b03968716815293861660208501529085168389015290841660608301526004356084810135608084015260a4013560a08301529190911660c08201529082169063ffffffff8416907fa0d8b561b80ba334b8b367f1fd53ab8d8719fa1c348a8de4bbfd8bbffa90b3379060e090a3825163ffffffff9290921682526001600160a01b03166020820152f35b015190505f806109c3565b9060088401875280872091875b601f1985168110610b3b57508360409894936008936001938b9896601f19811610610b23575b505050811b019101556109d8565b01515f1960f88460031b161c191690555f8080610b15565b91926020600181928685015181550194019201610aef565b828111156109a15760088401875260208720601f840160051c9060208510610ba0575b81601f9101920160051c0390875b828110610b925750506109a1565b808960019284015501610b84565b889150610b76565b634e487b7160e01b86526041600452602486fd5b8280fd5b60405162461bcd60e51b815260206004820152602e60248201527f506f7274616c2061646472657373206d69736d61746368202d206e6f6e63652060448201526d3a3930b1b5b4b7339032b93937b960911b6064820152608490fd5b610c299194505f90610f4a565b5f925f61077a565b6040513d5f823e3d90fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b607f8211610ca65750604051606b60f91b6020820152602560fa1b60218201523060601b602282015260f89190911b6001600160f81b031916603682015260178152610ca1603782610f4a565b610608565b60ff8211610cfd575060405160d760f81b6020820152602560fa1b60218201523060601b6022820152608160f81b603682015260f89190911b6001600160f81b031916603782015260188152610ca1603882610f4a565b61ffff8211610d555750604051601b60fb1b6020820152602560fa1b60218201523060601b6022820152604160f91b603682015260f09190911b6001600160f01b031916603782015260198152610ca1603982610f4a565b62ffffff8211610dae575060405160d960f81b6020820152602560fa1b60218201523060601b6022820152608360f81b603682015260e89190911b6001600160e81b0319166037820152601a8152610ca1603a82610f4a565b604051606d60f91b6020820152602560fa1b60218201523090911b6022820152602160fa1b603682015260e09190911b6001600160e01b0319166037820152601b8152610ca1603b82610f4a565b634e487b7160e01b5f52601160045260245ffd5b63e558bfa360e01b5f5260045ffd5b6307099c5360e21b5f5260045ffd5b63baa3de5f60e01b5f5260045ffd5b633c9f858360e21b5f5260045ffd5b630b5eba9f60e41b5f5260045ffd5b63c1ab6dc160e01b5f5260045ffd5b90506020813d602011610e9d575b81610e8560209383610f4a565b81010312610c3c57518015158103610c3c575f61050d565b3d9150610e78565b6330cd747160e01b5f5260045ffd5b34610c3c575f366003190112610c3c576004546040516001600160a01b039091168152602090f35b34610c3c576020366003190112610c3c576004356001600160a01b0381169190829003610c3c576020915f526002825260ff60405f20541615158152f35b356001600160a01b0381168103610c3c5790565b61014081019081106001600160401b03821117610c4057604052565b90601f801991011681019081106001600160401b03821117610c4057604052565b356001600160401b0381168103610c3c5790565b903590601e1981360301821215610c3c57018035906001600160401b038211610c3c57602001918136038313610c3c57565b90600182811c92168015610fdf575b6020831014610fcb57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610fc056fe60808060405234601557613b20908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c9081625d97ef146126af57508062ebfdb41461262557806309a0a234146123575780630d0c743e14611f235780630e18b68114611e945780630e86bbdc14611dff5780632678224714611dd657806327c71b5014611d505780632b7ac3f314611d275780632c37826e14611cfd5780632dfdf0b514611cd65780633488ce0d14611c6b57806337f981d814611c1657806339dc015d14611aad5780633cb747bf14611a845780633fd24907146117d05780634256ce38146117b257806345c5d2fb14611794578063580bbcfc1461176a5780635c1bba3814611743578063652ef10b14611568578063748538d91461152957806375829def146114a45780638081a8b21461148657806383a146b31461146b578063857e85f81461140f57806386f47e55146113f15780638976248d146113c557806394ce88b0146113a7578063959f47c3146112d35780639a97784b146112305780639ecd4cc0146111f8578063b01f22e414610bed578063b02690f214610bb5578063be2a63ee14610b8b578063bf8e244014610b07578063bffa55d514610a48578063c13a2d4b146109cf578063c690908a146108db578063cfaabb4d146108b1578063d179978a1461088d578063e09eae10146107fb578063e202d995146107d2578063e4643e8514610745578063e471784914610727578063e84abe69146106fd578063ecf79a4e146106d6578063ef10b1871461038e578063f22a195e14610370578063f490ca961461034d578063f706cfbf1461032f578063f851a44014610306578063fb2f1206146102e55763fe136c4e1461026e575f80fd5b346102e25760203660031901126102e2576040809161028b612855565b8160208451610299816129c4565b82815201526001600160a01b031681526008602052208151906102bb826129c4565b5460ff6020818316151593848152019160081c161515815282519182525115156020820152f35b80fd5b50346102e257806003193601126102e257602060065460c01c604051908152f35b50346102e257806003193601126102e2576001546040516001600160a01b039091168152602090f35b50346102e257806003193601126102e2576020604051620186a08152f35b50346102e257806003193601126102e2576020604051670de0b6b3a76400008152f35b50346102e257806003193601126102e2576020600454604051908152f35b50346102e25760a03660031901126102e25760043560243560ff8116908181036106d2576044359060ff82168092036106ce5784546001600160a01b031633036106bf576103db90613856565b156106b0576103e983613892565b156106b057836080602092604051848101903082528760408201528660608201526060815261041884826129df565b51902090604051918252848201526064356040820152608435606082015282805260015afa156106a557825183806401000003d019600781878181800909086040516020810191602083526020604083015260206060830152608082015263400000f4600160fe1b0360a08201526401000003d01960c082015260c081526104a160e0826129df565b519060055afa6104af61354b565b908061069a575b15610665576104c490613870565b6002831460018216150361063b575b6040519060208201908582526040830152604082526104f36060836129df565b905190206001600160a01b03918216801592909116908215610630575b5050610621576001600160401b0343169060405161052d816129a9565b83815260208101908282526040810190848252600754600160401b81101561060d5780600161055f9201600755612acd565b9190916105f95760ff916001915181550192511668ffffffffffffffff008354925160081b169168ffffffffffffffffff191617179055600754905f1982019182116105e557917f82b5f4090f18a082bc8156b956154bfe0319307f5e5a7e903ef33f14ad2cb17e9391608093604051938452602084015260408301526060820152a180f35b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b88526004889052602488fd5b634e487b7160e01b88526041600452602488fd5b6392536faf60e01b8352600483fd5b141590505f80610510565b6401000003d019036401000003d0198111156104d357634e487b7160e01b85526011600452602485fd5b60405162461bcd60e51b815260206004820152600d60248201526c1b5bd9195e1c0819985a5b1959609a1b6044820152606490fd5b5060208151146104b6565b6040513d84823e3d90fd5b632f0be49b60e11b8452600484fd5b6314f8a09f60e21b8552600485fd5b8480fd5b8380fd5b50346102e257806003193601126102e25760206001600160801b0360035416604051908152f35b50346102e257806003193601126102e25760206001600160401b0360065460401c16604051908152f35b50346102e257806003193601126102e2576020600954604051908152f35b50346102e257806003193601126102e2576002546001600160a01b03811690811580156107c8575b6107b95782546001600160a01b0319808216841785559091166002556001600160a01b03167f9945af900637995146537e5ea7a7be455dfd08bbb46fdd79e9c3a2bad0c4eef88380a380f35b63d71402d960e01b8352600483fd5b508133141561076d565b50346102e257806003193601126102e2576002546040516001600160a01b039091168152602090f35b50346102e25760203660031901126102e2576108156128d5565b81546001600160a01b0316330361087e57600680546001600160c01b031660c083901b6001600160c01b0319161790556040516001600160401b0390911681527f66bcd750662bb66118e25a8e421ae73974634d9af2d44fb9e600d250917fe69090602090a180f35b6314f8a09f60e21b8252600482fd5b50346102e257806003193601126102e257602063ffffffff60115416604051908152f35b50346102e25760203660031901126102e25760406020916004358152600d83522054604051908152f35b50346102e25760203660031901126102e2576108f5612855565b6001546001600160a01b031633036109c0576001600160a01b0381168083526008602052604083205460ff166109b1576040516335ec42c960e01b8152600481019190915260208160248161083f60921b5afa9081156109a6578391610977575b5015610968576109659061369e565b80f35b631fcf8c4760e11b8252600482fd5b610999915060203d60201161099f575b61099181836129df565b810190612a24565b5f610956565b503d610987565b6040513d85823e3d90fd5b632909298f60e11b8352600483fd5b637bfa4b9f60e01b8252600482fd5b50346102e25760403660031901126102e2576004356001600160401b038111610a44576101406003198236030112610a445781546001600160a01b0316330361087e57601054610a3557610a2e90600160105560243590600401612c9a565b8060105580f35b630b5c738160e01b8252600482fd5b5080fd5b50346102e25760203660031901126102e257610a62612855565b6001600160a01b038116808352600a60208181526040808620335f818152918452828220548689529484528288208183529093522080546001600160801b03191690556001600160801b0390911692610abc91849161394b565b15610af857602092506040518281527fffd3bbab073ab4b2d0792c270104924c14c285a153b9acddabae166395d2eb5c843392a3604051908152f35b63be51ced360e01b8352600483fd5b50346102e25760203660031901126102e257610b21612855565b81546001600160a01b03169033829003610b7c57600280546001600160a01b0319166001600160a01b03929092169182179055907f12cf9e4d760566fb6a3e0193406f2295fc4b53f2b60817145a61f29e470cf7d68380a380f35b6314f8a09f60e21b8352600483fd5b50346102e257806003193601126102e25760206001600160401b0360065460801c16604051908152f35b50346102e25760203660031901126102e2576020610bd4600435612c5a565b905460405160039290921b1c6001600160a01b03168152f35b50346102e25760a03660031901126102e257610c07612855565b906024356001600160801b0381168103610a44576001600160401b0360643511610a445760a060643536036003190112610a4457610c43612881565b906001600160a01b038216156111e957610c5c846132dc565b604051639c4bad2960e01b81526020816004816001600160a01b0389165afa9081156111b15783610ccb9260209287916111bc575b506040516337de09eb60e11b81526001600160401b0390911660048201526001600160a01b03909116602482015291829081906044820190565b038161100f60921b5afa9081156111b1578491611192575b501561118357610cff610cfa602460643501612bff565b613856565b1561117457610d1360643560040135613892565b15611174576040610d2e604460643501606435600401612c0d565b90500361114957610d40604435612b6b565b50156110b757610d509084613367565b9060405192610d5e8461297a565b6001600160a01b0386811685523360208601526001600160801b03841660408087019190915290821660608601526044356080860152519360a085016001600160401b038111868210176110a3576040526064356004013585526024606435013560ff8116810361109f5760208601526001600160401b03604460643501351161109b5736606435604481013501602301121561109b57610e0a60643560448101350160040135612c3f565b610e1760405191826129df565b606435604481013501600481013580835236602491909201011161109f5760643560448101350160048101359060240160208301376064803560448101358101600401358301602001899052604088019290925201356001600160a01b03198116900361109b57606480350135606086015260846064350135946001600160801b03198616958681036110975792611054886080610fcb6001600160401b03968660209e99847f4debdbd2891da07eb466d2025028a25aab636034cf3c941afd1025a0c590a07a9c99015260a082019081526005549060405194602093869485019750600188526060604086015260018060a01b038151168286015260018060a01b0360208201511660a08601526001600160801b0360408201511660c086015260018060a01b0360608201511660e08601520151610100840152519060c061012084015281516101408401528f60ff9083015116610160840152610f8d604083015160a06101808601526101e0850190612a00565b6060808401516001600160a01b0319166101a08601526080909301516001600160801b0319166101c08501529183015203601f1981018352826129df565b51902098899760ff610fdc8a613515565b956001600160801b03610ff3602460643501612bff565b9181611009604460643501606435600401612c0d565b969097506040519c60018060a01b03168d521660208c01521660408a015260443560608a01526064356004013560808a01521660a088015261016060c0880152610160870191612a3c565b6064803501356001600160a01b03191660e08601526101008501979097526001600160a01b031661012084015216610140820152339381900390a3604051908152f35b8780fd5b8580fd5b8680fd5b634e487b7160e01b87526041600452602487fd5b826007546044351015611134576110cf604435612acd565b5090600160443501918260443511611120576001600160401b03600181816110f8606497612acd565b5094015460081c1692015460081c169063034dff0f60e01b8352604435600452602452604452fd5b634e487b7160e01b82526011600452602482fd5b637f455d3760e11b8152604435600452602490fd5b60448361115f8260643501606435600401612c0d565b632331a96360e11b8352600452506040602452fd5b632f0be49b60e11b8352600483fd5b6354cfe65960e01b8352600483fd5b6111ab915060203d60201161099f5761099181836129df565b5f610ce3565b6040513d86823e3d90fd5b6111dc9150833d85116111e2575b6111d481836129df565b810190612be0565b5f610c91565b503d6111ca565b638dc30b3960e01b8352600483fd5b50346102e25760203660031901126102e25760406001600160401b0361121f600435612b6b565b835191151582529091166020820152f35b50346102e25760203660031901126102e257600435908060408051611254816129a9565b82815282602082015201526007548210156112c157606061127483612acd565b506001600160401b03604051611289816129a9565b60ff600184549485845201549183604060208301928486168452019360081c1683526040519485525116602084015251166040820152f35b602491637f455d3760e11b8252600452fd5b50346102e257806003193601126102e2576040519080600e54906112f682612942565b80855291600181169081156113805750600114611336575b6113328461131e818603826129df565b604051918291602083526020830190612a00565b0390f35b600e81525f516020613aab5f395f51905f52939250905b8082106113665750909150810160200161131e8261130e565b91926001816020925483858801015201910190929161134d565b60ff191660208087019190915292151560051b8501909201925061131e915083905061130e565b50346102e257806003193601126102e2576020600b54604051908152f35b50346102e257806003193601126102e25760206113e0612b46565b6001600160801b0360405191168152f35b50346102e257806003193601126102e2576020604051629896808152f35b50346102e25760403660031901126102e257604061142b612855565b9161143461286b565b9260018060a01b03168152600a602052209060018060a01b03165f5260205260206001600160801b0360405f205416604051908152f35b50346102e257806003193601126102e25760206113e0612afd565b50346102e257806003193601126102e2576020600c54604051908152f35b50346102e25760203660031901126102e2576114be612855565b6001546001600160a01b0316903382900361151a57600f80546001600160a01b0319166001600160a01b03929092169182179055907fe5cd1c804f1c9cc6d7009e4c0fb532f0e2d8863524c3323a6b3790c3f80bf25c8380a380f35b637bfa4b9f60e01b8352600483fd5b50346102e25760203660031901126102e25760209060ff906040906001600160a01b03611554612855565b168152600884522054166040519015158152f35b50346102e25760203660031901126102e2576004356001600160401b038111610a4457611599903690600401612915565b8254909291906001600160a01b0316330361087e576001600160401b03831161172f576115c7600e54612942565b601f81116116d3575b508192601f8111600114611645578083947ff4e00967b25e707df96d88676243b33be84847ef27615af8ef91290b52294fc6949161163a575b508160011b905f198360031b1c191617600e555b611634604051928392602084526020840191612a3c565b0390a180f35b90508201355f611609565b600e8352601f198116935f516020613aab5f395f51905f5290845b8681106116bb5750827ff4e00967b25e707df96d88676243b33be84847ef27615af8ef91290b52294fc69596106116a2575b5050600181811b01600e5561161d565b8301355f19600384901b60f8161c191690555f80611692565b90916020600181928588013581550193019101611660565b838111156115d057600e8352601f840160051c9060208510611727575b601f82910160051c0390835b82811061170a5750506115d0565b80855f516020613aab5f395f51905f5260019385010155016116fc565b8391506116f0565b634e487b7160e01b82526041600452602482fd5b50346102e257806003193601126102e257546040516001600160a01b039091168152602090f35b50346102e257806003193601126102e25760206001600160401b0360125460a01c16604051908152f35b50346102e257806003193601126102e2576020600554604051908152f35b50346102e257806003193601126102e2576020600754604051908152f35b50346102e2576101203660031901126102e25760043563ffffffff8116809103610a44576117fc61286b565b906044356001600160a01b03811681036106d2576064356001600160a01b03811692908390036106ce5761182e612881565b60a4356001600160a01b038116919082900361109f5761184c6128eb565b90610104356001600160401b038111611a805761186d903690600401612915565b969095735af1ffffffffffffffffffffffffffffffffffff193301611a71576012549560ff8760e01c16611a6357601180546001600160c01b0319169190911760209290921b640100000000600160c01b0316919091179055600180546001600160a01b03199081169290921790558854166001600160a01b039190911617875560c4356004556001600160e81b03199092161760a09190911b67ffffffffffffffff60a01b1617600160e01b176012556001600160401b038211611a4f57611937600e54612942565b601f81116119f3575b508390601f831160011461198057610965939291859183611975575b50508160011b915f199060031b1c191617600e5561369e565b013590505f8061195c565b600e85525f516020613aab5f395f51905f5291601f198416865b8181106119db5750916001939185610965979694106119c2575b505050811b01600e5561369e565b01355f19600384901b60f8161c191690555f80806119b4565b9193602060018192878701358155019501920161199a565b8281111561194057600e8552601f830160051c9060208410611a47575b601f82910160051c0390855b828110611a2a575050611940565b80875f516020613aab5f395f51905f526001938501015501611a1c565b859150611a10565b634e487b7160e01b84526041600452602484fd5b62dc149f60e41b8b5260048bfd5b631966391b60e11b8a5260048afd5b8880fd5b50346102e257806003193601126102e257601154604051602091821c6001600160a01b03168152f35b50346102e25760203660031901126102e257611ac76128d5565b906007549081158015611bbc575b611ba05780915f19810190811161112057836001600160401b0384929116925b818310611b2657606083611b0881612acd565b509060ff600183549301541660405192835260208301526040820152f35b9091828101808211611b8c5760018101809111611b8c5760011c90846001600160401b036001611b5585612acd565b50015460081c1611611b6a5750915b90611af5565b92505f19810190811115611b6457634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526011600452602483fd5b63302c66ab60e21b81526001600160401b038316600452602490fd5b5060075415611c0257600781527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6895460081c6001600160401b0390811690841610611ad5565b634e487b7160e01b81526032600452602490fd5b50346102e25760203660031901126102e2576020906040906001600160a01b03611c3e612855565b16815260088352205460ff81169081611c5d575b506040519015158152f35b60ff915060081c165f611c52565b50346102e257806003193601126102e257600754908115611cc7575f198201918211611cb3576040611c9c83612acd565b5060ff600182549201541682519182526020820152f35b634e487b7160e01b81526011600452602490fd5b630c322fb560e31b8152600490fd5b50346102e257806003193601126102e25760206001600160401b0360065416604051908152f35b50346102e257806003193601126102e25760206001600160401b0360035460801c16604051908152f35b50346102e257806003193601126102e2576012546040516001600160a01b039091168152602090f35b50346102e25760203660031901126102e257611d6a612855565b6001546001600160a01b031633036109c0576001600160a01b03168082526008602052604082205460ff161561096857808252600860205260408220805461ff00191690557feb225a736fbfee3f85ccb72bdf84ff0396ab358b7970e2cc351ab3e3fd92358d8280a280f35b50346102e257806003193601126102e257600f546040516001600160a01b039091168152602090f35b50346102e25760203660031901126102e2576004356001600160801b038116809103610a445781546001600160a01b0316330361087e57670de0b6b3a76400008111611e85576020817fc62141e607d6fcbf7d11fd2b6d8e18e5ebef6d3fff8136ca98822801abbaea38926001600160801b03196003541617600355604051908152a180f35b630d62f21160e11b8252600482fd5b50346102e257806003193601126102e257600f546001600160a01b0381169081158015611f19575b611f0a57600180546001600160a01b031980821685179092559116600f556001600160a01b03167ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec68380a380f35b63058d9a1b60e01b8352600483fd5b5081331415611ebc565b50346102e2576101603660031901126102e257611f3e6128d5565b6024356001600160401b038116918282036106d25760403660431901126106d25760803660831901126106d2576101043591610124356001600160401b03811161109b57611f90903690600401612915565b9094610144356001600160401b03811161109757611fb2903690600401612915565b88546001600160a01b03169190338390036123485760443593600454850361233957601254906001600160401b038916976001600160401b038360a01c1689106122fa578161231857505087944388116123095761200f8861357a565b945b85156122fa5761201f612a5c565b98600654996001600160401b03808c60401c169116148015906122d7575b80156122bb575b6122ac57908d96959493929163ffffffff6011541696600354996001600160401b038b60801c16995060018a01926001600160401b038411612295576001600160401b0393929184916040519b632d8a30cd60e21b8d5260048d015260248c01521660448a0152606489015216608487015260a486015260c4850152606435968760e486015260843561010486015260a4359b8c61012487015260c435916001600160401b03831680930361229157602095879561213d8f946121509489979688976101448901526001600160401b0361211c6128eb565b166101648901526101848801526101e06101a48801526101e4870191612a3c565b848103600319016101c486015291612a3c565b03916001600160a01b03165afa908115612286578991612267575b50156122585767ffffffffffffffff60801b9061218790612a9c565b60801b16906001600160401b0360801b1916176003556004556fffffffffffffffff00000000000000006121b9612a72565b60401b16916001600160401b0360801b9060801b169077ffffffffffffffffffffffffffffffff0000000000000000191617176006557f5a66941dc92cb865480c966eff640c02b1d00d544b74332fd67c6f1cbfccdf39608061221b836135e8565b936001600160401b03600354831c1693600454906001600160401b0360065460401c1691604051938452602084015260408301526060820152a380f35b6309bde33960e01b8852600488fd5b612280915060203d60201161099f5761099181836129df565b5f61216b565b6040513d8b823e3d90fd5b8e80fd5b50505060248f634e487b7160e01b81526011600452fd5b633d9dffbd60e01b8e5260048efd5b506122c4612a72565b6001600160401b03808c16911611612044565b506122e0612a72565b6001600160401b03806122f1612a5c565b1691161061203d565b632705871360e01b8d5260048dfd5b632705871360e01b8c5260048cfd5b8882979211156122fa574387116122fa57612333909661357a565b94612011565b6309bde33960e01b8b5260048bfd5b6314f8a09f60e21b8a5260048afd5b50346102e25760a03660031901126102e257612371612855565b61237961286b565b906123826128ab565b6064359061238e612881565b6001600160a01b038116959093908615612616576123ab826132dc565b604051639c4bad2960e01b81526001600160a01b03831695906020816004818a5afa9081156109a65783916125f7575b506040516337de09eb60e11b81526001600160401b03821660048201526001600160a01b038916602482015260208160448161100f60921b5afa9081156111b15784916125d8575b50156111835760405163b389e30560e01b81526001600160401b03821660048201526001600160a01b038916602482015260208160448161100f60921b5afa9081156111b15784916125b9575b5015611183576040516337de09eb60e11b81526001600160401b039190911660048201526001600160a01b0391909116602482015260208160448161100f60921b5afa9081156106a557829161259a575b501561258b5750946001600160401b03926124e66001600160801b0393602098613367565b939061252c82604051996124f98b61297a565b898b52338c8c015260018060a01b0316968760408c015216988960608201528560808201528460a0820152600554613490565b9761253689613515565b956040519889528a8901526040880152166060860152608085015260a08401521660c0820152817ffee50869847a4d073bfd83ec655472febff62beb46febf4ec48752f0686affd160e03393a3604051908152f35b6354cfe65960e01b8152600490fd5b6125b3915060203d60201161099f5761099181836129df565b5f6124c1565b6125d2915060203d60201161099f5761099181836129df565b5f612470565b6125f1915060203d60201161099f5761099181836129df565b5f612423565b612610915060203d6020116111e2576111d481836129df565b5f6123db565b638dc30b3960e01b8152600490fd5b50346102e25760203660031901126102e25761263f612855565b6001546001600160a01b031633036109c0576001600160a01b03168082526008602052604082205460ff161561096857808252600860205260408220805461ff0019166101001790557f22ab73af03f04a21e91c7923327f99279b7f5d07d9551762c39bccdf051f1fe98280a280f35b9050346128145760c0366003190112612814576126ca612855565b6126d261286b565b916126db6128ab565b6084356001600160401b0381168091036128145760a4356001600160401b0381116128145761270e903690600401612915565b9190943033036128465760115463a9059cbb60e01b86526001600160a01b03602091821c811660048801526001600160801b0386166024880152919091169490816044815f895af1908115612809575f91612827575b501561281857601154602081901c6001600160a01b031693843b15612814575f9663ffffffff9488946001600160801b036127e9946040519c8d9b8c9a8b996311da526160e01b8b521660048a01526024890152606435604489015260018060a01b0316606488015216608486015260a485015260e060c485015260e4840191612a3c565b03925af18015612809576127fb575080f35b61280791505f906129df565b005b6040513d5f823e3d90fd5b5f80fd5b6312171d8360e31b5f5260045ffd5b612840915060203d60201161099f5761099181836129df565b5f612764565b6314e1dbf760e11b5f5260045ffd5b600435906001600160a01b038216820361281457565b602435906001600160a01b038216820361281457565b608435906001600160a01b038216820361281457565b35906001600160a01b038216820361281457565b604435906001600160801b038216820361281457565b35906001600160801b038216820361281457565b600435906001600160401b038216820361281457565b60e435906001600160401b038216820361281457565b35906001600160401b038216820361281457565b9181601f84011215612814578235916001600160401b038311612814576020838186019501011161281457565b90600182811c92168015612970575b602083101461295c57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612951565b60c081019081106001600160401b0382111761299557604052565b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b0382111761299557604052565b604081019081106001600160401b0382111761299557604052565b90601f801991011681019081106001600160401b0382111761299557604052565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90816020910312612814575180151581036128145790565b908060209392818452848401375f828201840152601f01601f1916010190565b60c4356001600160401b03811681036128145790565b60e4356001600160401b03811681036128145790565b356001600160401b03811681036128145790565b6001600160401b03166001600160401b038114612ab95760010190565b634e487b7160e01b5f52601160045260245ffd5b600754811015612ae95760075f5260205f209060011b01905f90565b634e487b7160e01b5f52603260045260245ffd5b60065460c01c48810290808204481490151715612ab95764e8d4a51000810190818111612ab95764e8d4a50fff01908111612ab95764e8d4a510006001600160801b0391041690565b6001600160801b0360035416620186a0026001600160801b038116908103612ab95790565b60075480821015612bd8575f198101908111612ab9578114612bd05760018101809111612ab9576001600160401b036001612ba96201518093612acd565b50015460081c1601906001600160401b038211612ab9576001600160401b03821643109190565b506001905f90565b50505f905f90565b9081602091031261281457516001600160401b03811681036128145790565b3560ff811681036128145790565b903590601e198136030182121561281457018035906001600160401b0382116128145760200191813603831361281457565b6001600160401b03811161299557601f01601f191660200190565b600954811015612ae95760095f5260205f2001905f90565b356001600160a01b03811681036128145790565b356001600160801b03811681036128145790565b600b545f91600c5482146132cd576064820693845f52600d60205260405f2054905f19821480156132c3575b6132ae5780159384156132bc575f19935b60408051602081019182529590926001600160a01b03612cf684612897565b1660608801526020830135608088018190529960408401956001600160a01b03612d1f88612897565b1660a08a01526060850199612d338b6128c1565b6001600160801b031660c08b01526080860198612d4f8a6128c1565b6001600160801b031660e08c015260a08701356101008c015260c0870197612d7689612901565b6001600160401b03166101208d015260e088019b612d938d612901565b6001600160401b0316610140820152806101008a0198612db38a8c6139be565b610160840161014090526101a0840190612dcc92612a3c565b612dda6101208d018d6139be565b848303605f1901610180860152612df19291612a3c565b90604083015203601f1981018252612e0990826129df565b519020036132ae571561329b57505f52600d6020525f1960405f205560018101809111612ab957600b555b612e3d82612c72565b946001600160401b03612e4f88612a88565b16156130eb576001600160801b03612e6682612c86565b166130c6575b50629896806001600160401b03612e8285612a88565b1611613059576001600160401b03612e9984612a88565b16612f3e57505050916001600160801b035f516020613acb5f395f51905f529492612ef3612eed86612edf612ecf606099612c72565b612ed889612c86565b908661394b565b159586612f1b575b50612c72565b94612c86565b90604051975060018060a01b0316875216602086015215604085015260018060a01b031692a3565b612f3890612f31612f2b8a612c86565b91612a88565b90866139ef565b5f612ee7565b612f63612f4a85612c72565b91612f5d612f578a612c86565b95612a88565b93612c0d565b9092303b1561281457604051625d97ef60e01b81526001600160a01b03808916600483015290931660248401526001600160801b03949094166044830152606482018a90526001600160401b0393909316608482015260c060a4820152915f9183918291612fd59160c4840191612a3c565b038183305af1908161301a575b505f516020613acb5f395f51905f529492612ef3612eed606096946001600160801b0394155f146130135789612edf565b6001612edf565b6001600160801b0391965092612ef3612eed606096946130495f5f516020613acb5f395f51905f529a986129df565b5f99945094965050509294612fe2565b505050839194506130a161309b6001600160801b039261309660609661308f612f2b5f516020613acb5f395f51905f529a612c86565b908a6139ef565b612c72565b92612c86565b604080516001600160a01b0397881681529290911660208301525f90820152931692a3565b6130e4906130dd60018060a01b035f541691612c86565b908761394b565b505f612e6c565b50509350509350506130fe919350612c72565b613106612afd565b926001600160801b0361311882612c86565b166001600160801b03851611613280575b8361313661313b92612c86565b613347565b906001600160801b038416613263575b61315e8261315885612c72565b8361394b565b156131d4577f0f7ef08806234f85aaee43d3ba4589c3bc6d5ac3fc8edd56fc3d91cc7553bdcb926131cf906001600160a01b039061319b90612c72565b1694604051938493849160409194936001600160801b038092606086019760018060a01b0316865216602085015216910152565b0390a2565b6001600160a01b0381165f908152600a602052604090207f5fea28d0adb7d877ae3259768f41ad6741aa1784c4475746dd931364f62e68a1936131cf9161321a82612c72565b60018060a01b03165f5260205260405f206001600160801b036132408682845416613327565b82546001600160801b03191691161790556001600160a01b039061319b90612c72565b5f5461327a9085906001600160a01b03168361394b565b5061314b565b61313693508061329261313b92612c86565b94509050613129565b91505f52600d60205260405f2055612e34565b626aee3160e51b5f5260045ffd5b8193612cd7565b505f198114612cc6565b63d7fa91d160e01b5f5260045ffd5b6001600160a01b03165f9081526008602052604090205460ff8116156133185760081c60ff161561330957565b63dec712ef60e01b5f5260045ffd5b631fcf8c4760e11b5f5260045ffd5b906001600160801b03809116911601906001600160801b038211612ab957565b906001600160801b03809116911603906001600160801b038211612ab957565b9091613371612b46565b926001600160801b0361338b613385612afd565b86613327565b16906001600160801b03811691821061348157846133a891613347565b6040516323b872dd60e01b81523360048201523060248201526044810192909252926001600160a01b03166020826064815f855af1918215612809578592613464575b506001600160801b0382166133fe575050565b5f805460405163a9059cbb60e01b81526001600160a01b0390911660048201526001600160801b0393909316602484015260209183916044918391905af18015612809576134495750565b6134619060203d60201161099f5761099181836129df565b50565b61347c9060203d60201161099f5761099181836129df565b6133eb565b636ba4a1c760e01b5f5260045ffd5b6040519060a060208301935f8552600180831b038151166040850152600180831b036020820151166060850152600180831b0360408201511660808501526001600160801b0360608201511682850152600180831b0360808201511660c0850152015160e0830152610100820152610100815261350f610120826129df565b51902090565b60055560065461352d6001600160401b038216612a9c565b67ffffffffffffffff199091166001600160401b0382161760065590565b3d15613575573d9061355c82612c3f565b9161356a60405193846129df565b82523d5f602084013e565b606090565b905f80809360405160208101918252602081526135986040826129df565b519071f90827f1c53a10cb7a02335b1753200029355afa6135b761354b565b90806135dc575b6135c55750565b909150602081805181010312612814576020015190565b506020815110156135be565b801561363657600c5490600b548203828111612ab9576064111561362757606482065f52600d60205260405f205560018101808211612ab957600c5590565b632764e20b60e01b5f5260045ffd5b505f1990565b602081830312612814578051906001600160401b038211612814570181601f820112156128145780519061366f82612c3f565b9261367d60405194856129df565b8284526020838301011161281457815f9260208093018386015e8301015290565b6040516136aa816129c4565b600180825260208083019182526001600160a01b039093165f8181526008948590526040902092518354925161ffff1990931660ff911515919091161791151590931b61ff0016179055600954600160401b811015612995578060016137139201600955612c5a565b81546001600160a01b0360039290921b91821b19169083901b1790556040516306fdde0360e01b81525f81600481855afa908115612809575f9161383c575b506040516395d89b4160e01b81525f81600481865afa908115612809575f91613822575b5060405163e5a6b10f60e01b8152915f83600481875afa928315612809577f4ac4dcc08b0c26c3fb6b58c64c1392b7934b1ce6b0382a5986ea5c3de795e053936137de936131cf925f926137fa575b506137ec90604051958695606087526060870190612a00565b908582036020870152612a00565b908382036040850152612a00565b6137ec91925061381b903d805f833e61381381836129df565b81019061363c565b91906137c5565b61383691503d805f833e61381381836129df565b5f613776565b61385091503d805f833e61381381836129df565b5f613752565b60ff1660028114908115613868575090565b600391501490565b602081519101519060208110613884575090565b5f199060200360031b1b1690565b8015801561393b575b61392a575f9081906401000003d0199060079082908181800909086040516020810191602083526020604083015260206060830152608082015263800001e9600160ff1b0360a08201526401000003d01960c082015260c0815261390060e0826129df565b519060055afa61390e61354b565b9015801561392f575b61392a57613926600191613870565b1490565b505f90565b50602081511415613917565b506401000003d01981101561389b565b60405163a9059cbb60e01b81526001600160a01b0392831660048201526001600160801b03939093166024840152602091839160449183915f91165af15f918161399d575b5061399a57505f90565b90565b6139b791925060203d60201161099f5761099181836129df565b905f613990565b9035601e19823603018112156128145701602081359101916001600160401b03821161281457813603831361281457565b909160606001600160401b037fadf6f2901dd7af2f28a594f47a925894a08d4de10609dff591a80642648775c5921693613a6a6001600160801b0360405195613a378761297a565b60018060a01b031692838752306020880152876040880152169485848201525f60808201525f60a0820152600554613490565b9384600555600654906001600160401b03613a86818416612a9c565b1680926001600160401b0319161760065560405192835260208301526040820152a356febb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd65042ea6dad60c26f055e80ec401b3437c854ed586a0704d305bb4e9ea4518cfa26469706673582212202b8dda955d46534eaee92937eb58e0e26a50c920ce31a9087247c7bc9e9561bc64736f6c63430008230033a26469706673582212205101f645796bd2fe57425e6500c89093cb9242f240946b2b4cea1ebeea7faefd64736f6c6343000823003360808060405234601557610188908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c63b628c33414610025575f80fd5b346100db576101e03660031901126100db5760043563ffffffff8116036100db5761004e6100df565b506100576100f6565b5061006061010d565b5060a4356001600160a01b038116036100db5760403660c31901126100db576080366101031901126100db576101a43567ffffffffffffffff81116100db576100ad903690600401610124565b50506101c4359067ffffffffffffffff82116100db576100d36020923690600401610124565b505060018152f35b5f80fd5b6024359067ffffffffffffffff821682036100db57565b6044359067ffffffffffffffff821682036100db57565b6084359067ffffffffffffffff821682036100db57565b9181601f840112156100db5782359167ffffffffffffffff83116100db57602083818601950101116100db5756fea2646970667358221220f6b1c43c5e473bffec3efbb2db3ac9e4ff24721be90bbea41f364e3d73394ace64736f6c6343000823003360a034606e57601f6105a238819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e5760805260405161051b908161008782396080518181816047015261015e0152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816311da52611461007a5750637b9a730114610032575f80fd5b34610076575f366003190112610076576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100765760e0366003190112610076576004359063ffffffff8216809203610076576024356001600160a01b03811690819003610076576064356001600160a01b038116939084900361007657608435916fffffffffffffffffffffffffffffffff83168093036100765760a4359167ffffffffffffffff83168093036100765760c4359567ffffffffffffffff871161007657366023880112156100765786600401359567ffffffffffffffff871161007657366024888a010111610076575f546104a05760015f9081556390b7f6fd60e01b825260048201849052816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156102bf575f91610323575b50602001516001600160a01b031633036103145760405163a9059cbb60e01b81528160048201528560248201526020816044815f885af19081156102bf575f916102d9575b50156102ca5760e45f928760209860246040519b8c9a8b998a96630a137ff560e01b88526004880152338488015260443560448801526064870152608486015260c060a48601528260c486015201848401378181018301859052601f01601f19168101030193f19081156102bf575f9161027c575b506001600160e01b03191663f5ec800b60e01b0161026d575f8055005b63be51ced360e01b5f5260045ffd5b90506020813d6020116102b7575b81610297602093836104af565b8101031261007657516001600160e01b0319811681036100765781610250565b3d915061028a565b6040513d5f823e3d90fd5b6312171d8360e31b5f5260045ffd5b90506020813d60201161030c575b816102f4602093836104af565b810103126100765751801515810361007657886101db565b3d91506102e7565b63efc26b5760e01b5f5260045ffd5b90503d805f833e61033481836104af565b8101906020818303126100765780519067ffffffffffffffff8211610076570190610140828203126100765760405191610140830183811067ffffffffffffffff82111761048c57604052805163ffffffff8116810361007657835261039c602082016104d1565b60208401526103ad604082016104d1565b60408401526103be606082016104d1565b60608401526103cf608082016104d1565b60808401526103e060a082016104d1565b60a084015260c081015160c084015260e081015160e084015261010081015167ffffffffffffffff81168103610076576101008401526101208101519067ffffffffffffffff8211610076570181601f820112156100765780519067ffffffffffffffff821161048c5760405192610462601f8401601f1916602001856104af565b8284526020838301011161007657815f9260208093018386015e8301015261012082015288610196565b634e487b7160e01b5f52604160045260245ffd5b6336a4d21b60e11b5f5260045ffd5b90601f8019910116810190811067ffffffffffffffff82111761048c57604052565b51906001600160a01b03821682036100765756fea26469706673582212200f36a4980148d2a71d95327bec28816c2bc30f6d17b4bbfaace6a729e2bf4e2b64736f6c63430008230033" + "zoneFactoryBytecode": "0x60808060405234602357600163ffffffff195f5416175f5561473e90816100288239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301b290d314610aa657508063266db43614610a8457806374134d3714610a675780638da5cb5b14610a3f57806390b7f6fd146107f7578063f2fde38b146107715763fadde3441461006b575f80fd5b346106b05760203660031901126106b0576004356001600160401b0381116106b05760e060031982360301126106b0576003546001600160a01b03163303610762576100b981600401610b59565b6040516335ec42c960e01b81526001600160a01b03909116600482015260208160248161083f60921b5afa9081156106a5575f91610727575b5015610718576001600160a01b0361010c60248301610b59565b1615610709576001600160a01b0361012660448301610b59565b16156106fa5762e4e1c05a106106eb575f549063ffffffff808316146106dc57600163ffffffff83160163ffffffff81116106c85763ffffffff1663ffffffff198316175f55604051613b558082018281106001600160401b038211176106b4578291610bb4833903905ff09081156106a5576101a581600401610b59565b6101b160248301610b59565b6101bd60448401610b59565b906101ca60a48501610b6d565b906101db60c4860186600401610b81565b9092906001600160a01b0388163b156106b057604051633fd2490760e01b815263ffffffff8a1660048201526001600160a01b039687166024820152615a4d60901b6044820152928616606480850191909152959094166084830152612d2b60911b60a48301529385013560c48201526001600160401b039390931660e484015261012061010484015261012483018290525f9183916101449183918190838501378181018301859052601f01601f19168101030181836001600160a01b0388165af180156106a557610690575b506102b681600401610b59565b6102c260248301610b59565b6102ce60448401610b59565b906001600160401b036102e360a48601610b6d565b6102f360c4870187600401610b81565b9490936040519661030388610ae4565b63ffffffff8b1688526001600160a01b038a811660208a015290811660408901529081166060880152166080860152606486013560a0860152608486013560c08601521660e08401526001600160401b038211610678578690604051926103746020601f19601f8401160185610b00565b808452368183011161068c57806020928386013783010152610100820190815263ffffffff8581168752600160208181526040808a2086518154848901516001600160c01b031990911691909616179490921b640100000000600160c01b03169390931781559184015190820180546001600160a01b03199081166001600160a01b0393841617909155606085015160028401805483169184169190911790556080850151600384018054909216921691909117905560a0830151600482015560c0830151600582015560e09092015160068301805467ffffffffffffffff19166001600160401b03928316179055905180519182116106785761047b6007840154610b21565b601f8111610623575b50602090601f83116001146105b257828893604099936007938b9795926105a7575b50508160011b915f199060031b1c1916179101555b6001600160a01b0384168152600260205220805460ff191660011790556001600160401b036104ec60048301610b59565b9160846104fb60248301610b59565b9161050860448201610b59565b61051460a48301610b6d565b89516001600160a01b0397881681529487166020860152908616848a0152612d2b60911b60608501526064820135608085015291013560a08301529190911660c08201529082169063ffffffff8416907fa0d8b561b80ba334b8b367f1fd53ab8d8719fa1c348a8de4bbfd8bbffa90b3379060e090a3825163ffffffff9290921682526001600160a01b03166020820152f35b015190505f806104a6565b9060078401885280882091885b601f198516811061060b57508360409994936007936001938c9896601f198116106105f3575b505050811b019101556104bb565b01515f1960f88460031b161c191690555f80806105e5565b919260206001819286850151815501940192016105bf565b828111156104845760078401885260208820601f840160051c9060208510610670575b81601f9101920160051c0390885b828110610662575050610484565b808a60019284015501610654565b899150610646565b634e487b7160e01b87526041600452602487fd5b8280fd5b61069d9194505f90610b00565b5f925f6102a9565b6040513d5f823e3d90fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b63e558bfa360e01b5f5260045ffd5b6307099c5360e21b5f5260045ffd5b633c9f858360e21b5f5260045ffd5b630b5eba9f60e41b5f5260045ffd5b63c1ab6dc160e01b5f5260045ffd5b90506020813d60201161075a575b8161074260209383610b00565b810103126106b0575180151581036106b0575f6100f2565b3d9150610735565b6330cd747160e01b5f5260045ffd5b346106b05760203660031901126106b0576004356001600160a01b038116908190036106b0576003546001600160a01b03811690338290036107625782156107e8576001600160a01b03191682176003557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b6349e27cff60e01b5f5260045ffd5b346106b05760203660031901126106b05760043563ffffffff81168091036106b057606061010060405161082a81610ae4565b5f81525f60208201525f60408201525f838201525f60808201525f60a08201525f60c08201525f60e082015201525f52600160205260405f2060405161086f81610ae4565b815463ffffffff811682526001600160a01b03602091821c81169183019182526001840154811660408085019182526002860154831660608601908152600387015490931660808601908152600487015460a08701908152600588015460c0880190815260068901546001600160401b031660e0890190815293516007909901805494979196929593949293925f9161090782610b21565b808d529160018116908115610a1b57506001146109dc575b63ffffffff6101608c60208f6001600160401b038f8f8f8f8f8f8f8f8961094791038a610b00565b6101008b019889526040519c8d9b8b8d5251168a8c015260018060a01b0390511660408b015260018060a01b0390511660608a015260018060a01b03905116608089015260018060a01b0390511660a08801525160c08701525160e086015251166101008401525161012080840152805191829182610140860152018484015e5f828201840152601f01601f19168101030190f35b5f908152602081209092505b818310610a005750508901602090810190849061091f565b6001818d6020868195979697549201015201910191906109e8565b60ff191660208e81019190915292151560051b8d01830193508692915061091f9050565b346106b0575f3660031901126106b0576003546040516001600160a01b039091168152602090f35b346106b0575f3660031901126106b057602060405162e4e1c08152f35b346106b0575f3660031901126106b057602063ffffffff5f5416604051908152f35b346106b05760203660031901126106b0576004356001600160a01b03811691908290036106b0576020915f526002825260ff60405f20541615158152f35b61012081019081106001600160401b038211176106b457604052565b90601f801991011681019081106001600160401b038211176106b457604052565b90600182811c92168015610b4f575b6020831014610b3b57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610b30565b356001600160a01b03811681036106b05790565b356001600160401b03811681036106b05790565b903590601e19813603018212156106b057018035906001600160401b0382116106b0576020019181360383136106b05756fe60808060405234601557613b3b908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c9081625d97ef146126ca57508062ebfdb41461264057806309a0a234146123725780630d0c743e14611f3e5780630e18b68114611eaf5780630e86bbdc14611e1a5780632678224714611df157806327c71b5014611d6b5780632b7ac3f314611d425780632c37826e14611d185780632dfdf0b514611cf15780633488ce0d14611c8657806337f981d814611c3157806339dc015d14611ac85780633cb747bf14611a9f5780633fd24907146117d05780634256ce38146117b257806345c5d2fb14611794578063580bbcfc1461176a5780635c1bba3814611743578063652ef10b14611568578063748538d91461152957806375829def146114a45780638081a8b21461148657806383a146b31461146b578063857e85f81461140f57806386f47e55146113f15780638976248d146113c557806394ce88b0146113a7578063959f47c3146112d35780639a97784b146112305780639ecd4cc0146111f8578063b01f22e414610bed578063b02690f214610bb5578063be2a63ee14610b8b578063bf8e244014610b07578063bffa55d514610a48578063c13a2d4b146109cf578063c690908a146108db578063cfaabb4d146108b1578063d179978a1461088d578063e09eae10146107fb578063e202d995146107d2578063e4643e8514610745578063e471784914610727578063e84abe69146106fd578063ecf79a4e146106d6578063ef10b1871461038e578063f22a195e14610370578063f490ca961461034d578063f706cfbf1461032f578063f851a44014610306578063fb2f1206146102e55763fe136c4e1461026e575f80fd5b346102e25760203660031901126102e2576040809161028b612870565b8160208451610299816129df565b82815201526001600160a01b031681526008602052208151906102bb826129df565b5460ff6020818316151593848152019160081c161515815282519182525115156020820152f35b80fd5b50346102e257806003193601126102e257602060065460c01c604051908152f35b50346102e257806003193601126102e2576001546040516001600160a01b039091168152602090f35b50346102e257806003193601126102e2576020604051620186a08152f35b50346102e257806003193601126102e2576020604051670de0b6b3a76400008152f35b50346102e257806003193601126102e2576020600454604051908152f35b50346102e25760a03660031901126102e25760043560243560ff8116908181036106d2576044359060ff82168092036106ce5784546001600160a01b031633036106bf576103db90613871565b156106b0576103e9836138ad565b156106b057836080602092604051848101903082528760408201528660608201526060815261041884826129fa565b51902090604051918252848201526064356040820152608435606082015282805260015afa156106a557825183806401000003d019600781878181800909086040516020810191602083526020604083015260206060830152608082015263400000f4600160fe1b0360a08201526401000003d01960c082015260c081526104a160e0826129fa565b519060055afa6104af613566565b908061069a575b15610665576104c49061388b565b6002831460018216150361063b575b6040519060208201908582526040830152604082526104f36060836129fa565b905190206001600160a01b03918216801592909116908215610630575b5050610621576001600160401b0343169060405161052d816129c4565b83815260208101908282526040810190848252600754600160401b81101561060d5780600161055f9201600755612ae8565b9190916105f95760ff916001915181550192511668ffffffffffffffff008354925160081b169168ffffffffffffffffff191617179055600754905f1982019182116105e557917f82b5f4090f18a082bc8156b956154bfe0319307f5e5a7e903ef33f14ad2cb17e9391608093604051938452602084015260408301526060820152a180f35b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b88526004889052602488fd5b634e487b7160e01b88526041600452602488fd5b6392536faf60e01b8352600483fd5b141590505f80610510565b6401000003d019036401000003d0198111156104d357634e487b7160e01b85526011600452602485fd5b60405162461bcd60e51b815260206004820152600d60248201526c1b5bd9195e1c0819985a5b1959609a1b6044820152606490fd5b5060208151146104b6565b6040513d84823e3d90fd5b632f0be49b60e11b8452600484fd5b6314f8a09f60e21b8552600485fd5b8480fd5b8380fd5b50346102e257806003193601126102e25760206001600160801b0360035416604051908152f35b50346102e257806003193601126102e25760206001600160401b0360065460401c16604051908152f35b50346102e257806003193601126102e2576020600954604051908152f35b50346102e257806003193601126102e2576002546001600160a01b03811690811580156107c8575b6107b95782546001600160a01b0319808216841785559091166002556001600160a01b03167f9945af900637995146537e5ea7a7be455dfd08bbb46fdd79e9c3a2bad0c4eef88380a380f35b63d71402d960e01b8352600483fd5b508133141561076d565b50346102e257806003193601126102e2576002546040516001600160a01b039091168152602090f35b50346102e25760203660031901126102e2576108156128f0565b81546001600160a01b0316330361087e57600680546001600160c01b031660c083901b6001600160c01b0319161790556040516001600160401b0390911681527f66bcd750662bb66118e25a8e421ae73974634d9af2d44fb9e600d250917fe69090602090a180f35b6314f8a09f60e21b8252600482fd5b50346102e257806003193601126102e257602063ffffffff60115416604051908152f35b50346102e25760203660031901126102e25760406020916004358152600d83522054604051908152f35b50346102e25760203660031901126102e2576108f5612870565b6001546001600160a01b031633036109c0576001600160a01b0381168083526008602052604083205460ff166109b1576040516335ec42c960e01b8152600481019190915260208160248161083f60921b5afa9081156109a6578391610977575b501561096857610965906136b9565b80f35b631fcf8c4760e11b8252600482fd5b610999915060203d60201161099f575b61099181836129fa565b810190612a3f565b5f610956565b503d610987565b6040513d85823e3d90fd5b632909298f60e11b8352600483fd5b637bfa4b9f60e01b8252600482fd5b50346102e25760403660031901126102e2576004356001600160401b038111610a44576101406003198236030112610a445781546001600160a01b0316330361087e57601054610a3557610a2e90600160105560243590600401612cb5565b8060105580f35b630b5c738160e01b8252600482fd5b5080fd5b50346102e25760203660031901126102e257610a62612870565b6001600160a01b038116808352600a60208181526040808620335f818152918452828220548689529484528288208183529093522080546001600160801b03191690556001600160801b0390911692610abc918491613966565b15610af857602092506040518281527fffd3bbab073ab4b2d0792c270104924c14c285a153b9acddabae166395d2eb5c843392a3604051908152f35b63be51ced360e01b8352600483fd5b50346102e25760203660031901126102e257610b21612870565b81546001600160a01b03169033829003610b7c57600280546001600160a01b0319166001600160a01b03929092169182179055907f12cf9e4d760566fb6a3e0193406f2295fc4b53f2b60817145a61f29e470cf7d68380a380f35b6314f8a09f60e21b8352600483fd5b50346102e257806003193601126102e25760206001600160401b0360065460801c16604051908152f35b50346102e25760203660031901126102e2576020610bd4600435612c75565b905460405160039290921b1c6001600160a01b03168152f35b50346102e25760a03660031901126102e257610c07612870565b906024356001600160801b0381168103610a44576001600160401b0360643511610a445760a060643536036003190112610a4457610c4361289c565b906001600160a01b038216156111e957610c5c846132f7565b604051639c4bad2960e01b81526020816004816001600160a01b0389165afa9081156111b15783610ccb9260209287916111bc575b506040516337de09eb60e11b81526001600160401b0390911660048201526001600160a01b03909116602482015291829081906044820190565b038161100f60921b5afa9081156111b1578491611192575b501561118357610cff610cfa602460643501612c1a565b613871565b1561117457610d13606435600401356138ad565b15611174576040610d2e604460643501606435600401612c28565b90500361114957610d40604435612b86565b50156110b757610d509084613382565b9060405192610d5e84612995565b6001600160a01b0386811685523360208601526001600160801b03841660408087019190915290821660608601526044356080860152519360a085016001600160401b038111868210176110a3576040526064356004013585526024606435013560ff8116810361109f5760208601526001600160401b03604460643501351161109b5736606435604481013501602301121561109b57610e0a60643560448101350160040135612c5a565b610e1760405191826129fa565b606435604481013501600481013580835236602491909201011161109f5760643560448101350160048101359060240160208301376064803560448101358101600401358301602001899052604088019290925201356001600160a01b03198116900361109b57606480350135606086015260846064350135946001600160801b03198616958681036110975792611054886080610fcb6001600160401b03968660209e99847f4debdbd2891da07eb466d2025028a25aab636034cf3c941afd1025a0c590a07a9c99015260a082019081526005549060405194602093869485019750600188526060604086015260018060a01b038151168286015260018060a01b0360208201511660a08601526001600160801b0360408201511660c086015260018060a01b0360608201511660e08601520151610100840152519060c061012084015281516101408401528f60ff9083015116610160840152610f8d604083015160a06101808601526101e0850190612a1b565b6060808401516001600160a01b0319166101a08601526080909301516001600160801b0319166101c08501529183015203601f1981018352826129fa565b51902098899760ff610fdc8a613530565b956001600160801b03610ff3602460643501612c1a565b9181611009604460643501606435600401612c28565b969097506040519c60018060a01b03168d521660208c01521660408a015260443560608a01526064356004013560808a01521660a088015261016060c0880152610160870191612a57565b6064803501356001600160a01b03191660e08601526101008501979097526001600160a01b031661012084015216610140820152339381900390a3604051908152f35b8780fd5b8580fd5b8680fd5b634e487b7160e01b87526041600452602487fd5b826007546044351015611134576110cf604435612ae8565b5090600160443501918260443511611120576001600160401b03600181816110f8606497612ae8565b5094015460081c1692015460081c169063034dff0f60e01b8352604435600452602452604452fd5b634e487b7160e01b82526011600452602482fd5b637f455d3760e11b8152604435600452602490fd5b60448361115f8260643501606435600401612c28565b632331a96360e11b8352600452506040602452fd5b632f0be49b60e11b8352600483fd5b6354cfe65960e01b8352600483fd5b6111ab915060203d60201161099f5761099181836129fa565b5f610ce3565b6040513d86823e3d90fd5b6111dc9150833d85116111e2575b6111d481836129fa565b810190612bfb565b5f610c91565b503d6111ca565b638dc30b3960e01b8352600483fd5b50346102e25760203660031901126102e25760406001600160401b0361121f600435612b86565b835191151582529091166020820152f35b50346102e25760203660031901126102e257600435908060408051611254816129c4565b82815282602082015201526007548210156112c157606061127483612ae8565b506001600160401b03604051611289816129c4565b60ff600184549485845201549183604060208301928486168452019360081c1683526040519485525116602084015251166040820152f35b602491637f455d3760e11b8252600452fd5b50346102e257806003193601126102e2576040519080600e54906112f68261295d565b80855291600181169081156113805750600114611336575b6113328461131e818603826129fa565b604051918291602083526020830190612a1b565b0390f35b600e81525f516020613ac65f395f51905f52939250905b8082106113665750909150810160200161131e8261130e565b91926001816020925483858801015201910190929161134d565b60ff191660208087019190915292151560051b8501909201925061131e915083905061130e565b50346102e257806003193601126102e2576020600b54604051908152f35b50346102e257806003193601126102e25760206113e0612b61565b6001600160801b0360405191168152f35b50346102e257806003193601126102e2576020604051629896808152f35b50346102e25760403660031901126102e257604061142b612870565b91611434612886565b9260018060a01b03168152600a602052209060018060a01b03165f5260205260206001600160801b0360405f205416604051908152f35b50346102e257806003193601126102e25760206113e0612b18565b50346102e257806003193601126102e2576020600c54604051908152f35b50346102e25760203660031901126102e2576114be612870565b6001546001600160a01b0316903382900361151a57600f80546001600160a01b0319166001600160a01b03929092169182179055907fe5cd1c804f1c9cc6d7009e4c0fb532f0e2d8863524c3323a6b3790c3f80bf25c8380a380f35b637bfa4b9f60e01b8352600483fd5b50346102e25760203660031901126102e25760209060ff906040906001600160a01b03611554612870565b168152600884522054166040519015158152f35b50346102e25760203660031901126102e2576004356001600160401b038111610a4457611599903690600401612930565b8254909291906001600160a01b0316330361087e576001600160401b03831161172f576115c7600e5461295d565b601f81116116d3575b508192601f8111600114611645578083947ff4e00967b25e707df96d88676243b33be84847ef27615af8ef91290b52294fc6949161163a575b508160011b905f198360031b1c191617600e555b611634604051928392602084526020840191612a57565b0390a180f35b90508201355f611609565b600e8352601f198116935f516020613ac65f395f51905f5290845b8681106116bb5750827ff4e00967b25e707df96d88676243b33be84847ef27615af8ef91290b52294fc69596106116a2575b5050600181811b01600e5561161d565b8301355f19600384901b60f8161c191690555f80611692565b90916020600181928588013581550193019101611660565b838111156115d057600e8352601f840160051c9060208510611727575b601f82910160051c0390835b82811061170a5750506115d0565b80855f516020613ac65f395f51905f5260019385010155016116fc565b8391506116f0565b634e487b7160e01b82526041600452602482fd5b50346102e257806003193601126102e257546040516001600160a01b039091168152602090f35b50346102e257806003193601126102e25760206001600160401b0360125460a01c16604051908152f35b50346102e257806003193601126102e2576020600554604051908152f35b50346102e257806003193601126102e2576020600754604051908152f35b50346102e2576101203660031901126102e25760043563ffffffff8116809103610a44576117fc612886565b906044356001600160a01b03811681036106d2576064356001600160a01b03811692908390036106ce5761182e61289c565b60a4356001600160a01b038116919082900361109f5761184c612906565b90610104356001600160401b038111611a9b5761186d903690600401612930565b96909530615ad160901b14611a8c57735af1ffffffffffffffffffffffffffffffffffff193301611a7d576012549560ff8760e01c16611a6f57601180546001600160c01b0319169190911760209290921b640100000000600160c01b0316919091179055600180546001600160a01b03199081169290921790558854166001600160a01b039190911617875560c4356004556001600160e81b03199092161760a09190911b67ffffffffffffffff60a01b1617600160e01b176012556001600160401b038211611a5b57611943600e5461295d565b601f81116119ff575b508390601f831160011461198c57610965939291859183611981575b50508160011b915f199060031b1c191617600e556136b9565b013590505f80611968565b600e85525f516020613ac65f395f51905f5291601f198416865b8181106119e75750916001939185610965979694106119ce575b505050811b01600e556136b9565b01355f19600384901b60f8161c191690555f80806119c0565b919360206001819287870135815501950192016119a6565b8281111561194c57600e8552601f830160051c9060208410611a53575b601f82910160051c0390855b828110611a3657505061194c565b80875f516020613ac65f395f51905f526001938501015501611a28565b859150611a1c565b634e487b7160e01b84526041600452602484fd5b62dc149f60e41b8b5260048bfd5b631966391b60e11b8a5260048afd5b63b25caa5160e01b8a5260048afd5b8880fd5b50346102e257806003193601126102e257601154604051602091821c6001600160a01b03168152f35b50346102e25760203660031901126102e257611ae26128f0565b906007549081158015611bd7575b611bbb5780915f19810190811161112057836001600160401b0384929116925b818310611b4157606083611b2381612ae8565b509060ff600183549301541660405192835260208301526040820152f35b9091828101808211611ba75760018101809111611ba75760011c90846001600160401b036001611b7085612ae8565b50015460081c1611611b855750915b90611b10565b92505f19810190811115611b7f57634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526011600452602483fd5b63302c66ab60e21b81526001600160401b038316600452602490fd5b5060075415611c1d57600781527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6895460081c6001600160401b0390811690841610611af0565b634e487b7160e01b81526032600452602490fd5b50346102e25760203660031901126102e2576020906040906001600160a01b03611c59612870565b16815260088352205460ff81169081611c78575b506040519015158152f35b60ff915060081c165f611c6d565b50346102e257806003193601126102e257600754908115611ce2575f198201918211611cce576040611cb783612ae8565b5060ff600182549201541682519182526020820152f35b634e487b7160e01b81526011600452602490fd5b630c322fb560e31b8152600490fd5b50346102e257806003193601126102e25760206001600160401b0360065416604051908152f35b50346102e257806003193601126102e25760206001600160401b0360035460801c16604051908152f35b50346102e257806003193601126102e2576012546040516001600160a01b039091168152602090f35b50346102e25760203660031901126102e257611d85612870565b6001546001600160a01b031633036109c0576001600160a01b03168082526008602052604082205460ff161561096857808252600860205260408220805461ff00191690557feb225a736fbfee3f85ccb72bdf84ff0396ab358b7970e2cc351ab3e3fd92358d8280a280f35b50346102e257806003193601126102e257600f546040516001600160a01b039091168152602090f35b50346102e25760203660031901126102e2576004356001600160801b038116809103610a445781546001600160a01b0316330361087e57670de0b6b3a76400008111611ea0576020817fc62141e607d6fcbf7d11fd2b6d8e18e5ebef6d3fff8136ca98822801abbaea38926001600160801b03196003541617600355604051908152a180f35b630d62f21160e11b8252600482fd5b50346102e257806003193601126102e257600f546001600160a01b0381169081158015611f34575b611f2557600180546001600160a01b031980821685179092559116600f556001600160a01b03167ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec68380a380f35b63058d9a1b60e01b8352600483fd5b5081331415611ed7565b50346102e2576101603660031901126102e257611f596128f0565b6024356001600160401b038116918282036106d25760403660431901126106d25760803660831901126106d2576101043591610124356001600160401b03811161109b57611fab903690600401612930565b9094610144356001600160401b03811161109757611fcd903690600401612930565b88546001600160a01b03169190338390036123635760443593600454850361235457601254906001600160401b038916976001600160401b038360a01c168910612315578161233357505087944388116123245761202a88613595565b945b85156123155761203a612a77565b98600654996001600160401b03808c60401c169116148015906122f2575b80156122d6575b6122c757908d96959493929163ffffffff6011541696600354996001600160401b038b60801c16995060018a01926001600160401b0384116122b0576001600160401b0393929184916040519b632d8a30cd60e21b8d5260048d015260248c01521660448a0152606489015216608487015260a486015260c4850152606435968760e486015260843561010486015260a4359b8c61012487015260c435916001600160401b0383168093036122ac5760209587956121588f9461216b9489979688976101448901526001600160401b03612137612906565b166101648901526101848801526101e06101a48801526101e4870191612a57565b848103600319016101c486015291612a57565b03916001600160a01b03165afa9081156122a1578991612282575b50156122735767ffffffffffffffff60801b906121a290612ab7565b60801b16906001600160401b0360801b1916176003556004556fffffffffffffffff00000000000000006121d4612a8d565b60401b16916001600160401b0360801b9060801b169077ffffffffffffffffffffffffffffffff0000000000000000191617176006557f5a66941dc92cb865480c966eff640c02b1d00d544b74332fd67c6f1cbfccdf39608061223683613603565b936001600160401b03600354831c1693600454906001600160401b0360065460401c1691604051938452602084015260408301526060820152a380f35b6309bde33960e01b8852600488fd5b61229b915060203d60201161099f5761099181836129fa565b5f612186565b6040513d8b823e3d90fd5b8e80fd5b50505060248f634e487b7160e01b81526011600452fd5b633d9dffbd60e01b8e5260048efd5b506122df612a8d565b6001600160401b03808c1691161161205f565b506122fb612a8d565b6001600160401b038061230c612a77565b16911610612058565b632705871360e01b8d5260048dfd5b632705871360e01b8c5260048cfd5b888297921115612315574387116123155761234e9096613595565b9461202c565b6309bde33960e01b8b5260048bfd5b6314f8a09f60e21b8a5260048afd5b50346102e25760a03660031901126102e25761238c612870565b612394612886565b9061239d6128c6565b606435906123a961289c565b6001600160a01b038116959093908615612631576123c6826132f7565b604051639c4bad2960e01b81526001600160a01b03831695906020816004818a5afa9081156109a6578391612612575b506040516337de09eb60e11b81526001600160401b03821660048201526001600160a01b038916602482015260208160448161100f60921b5afa9081156111b15784916125f3575b50156111835760405163b389e30560e01b81526001600160401b03821660048201526001600160a01b038916602482015260208160448161100f60921b5afa9081156111b15784916125d4575b5015611183576040516337de09eb60e11b81526001600160401b039190911660048201526001600160a01b0391909116602482015260208160448161100f60921b5afa9081156106a55782916125b5575b50156125a65750946001600160401b03926125016001600160801b0393602098613382565b939061254782604051996125148b612995565b898b52338c8c015260018060a01b0316968760408c015216988960608201528560808201528460a08201526005546134ab565b9761255189613530565b956040519889528a8901526040880152166060860152608085015260a08401521660c0820152817ffee50869847a4d073bfd83ec655472febff62beb46febf4ec48752f0686affd160e03393a3604051908152f35b6354cfe65960e01b8152600490fd5b6125ce915060203d60201161099f5761099181836129fa565b5f6124dc565b6125ed915060203d60201161099f5761099181836129fa565b5f61248b565b61260c915060203d60201161099f5761099181836129fa565b5f61243e565b61262b915060203d6020116111e2576111d481836129fa565b5f6123f6565b638dc30b3960e01b8152600490fd5b50346102e25760203660031901126102e25761265a612870565b6001546001600160a01b031633036109c0576001600160a01b03168082526008602052604082205460ff161561096857808252600860205260408220805461ff0019166101001790557f22ab73af03f04a21e91c7923327f99279b7f5d07d9551762c39bccdf051f1fe98280a280f35b90503461282f5760c036600319011261282f576126e5612870565b6126ed612886565b916126f66128c6565b6084356001600160401b03811680910361282f5760a4356001600160401b03811161282f57612729903690600401612930565b9190943033036128615760115463a9059cbb60e01b86526001600160a01b03602091821c811660048801526001600160801b0386166024880152919091169490816044815f895af1908115612824575f91612842575b501561283357601154602081901c6001600160a01b031693843b1561282f575f9663ffffffff9488946001600160801b03612804946040519c8d9b8c9a8b996311da526160e01b8b521660048a01526024890152606435604489015260018060a01b0316606488015216608486015260a485015260e060c485015260e4840191612a57565b03925af1801561282457612816575080f35b61282291505f906129fa565b005b6040513d5f823e3d90fd5b5f80fd5b6312171d8360e31b5f5260045ffd5b61285b915060203d60201161099f5761099181836129fa565b5f61277f565b6314e1dbf760e11b5f5260045ffd5b600435906001600160a01b038216820361282f57565b602435906001600160a01b038216820361282f57565b608435906001600160a01b038216820361282f57565b35906001600160a01b038216820361282f57565b604435906001600160801b038216820361282f57565b35906001600160801b038216820361282f57565b600435906001600160401b038216820361282f57565b60e435906001600160401b038216820361282f57565b35906001600160401b038216820361282f57565b9181601f8401121561282f578235916001600160401b03831161282f576020838186019501011161282f57565b90600182811c9216801561298b575b602083101461297757565b634e487b7160e01b5f52602260045260245ffd5b91607f169161296c565b60c081019081106001600160401b038211176129b057604052565b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b038211176129b057604052565b604081019081106001600160401b038211176129b057604052565b90601f801991011681019081106001600160401b038211176129b057604052565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9081602091031261282f5751801515810361282f5790565b908060209392818452848401375f828201840152601f01601f1916010190565b60c4356001600160401b038116810361282f5790565b60e4356001600160401b038116810361282f5790565b356001600160401b038116810361282f5790565b6001600160401b03166001600160401b038114612ad45760010190565b634e487b7160e01b5f52601160045260245ffd5b600754811015612b045760075f5260205f209060011b01905f90565b634e487b7160e01b5f52603260045260245ffd5b60065460c01c48810290808204481490151715612ad45764e8d4a51000810190818111612ad45764e8d4a50fff01908111612ad45764e8d4a510006001600160801b0391041690565b6001600160801b0360035416620186a0026001600160801b038116908103612ad45790565b60075480821015612bf3575f198101908111612ad4578114612beb5760018101809111612ad4576001600160401b036001612bc46201518093612ae8565b50015460081c1601906001600160401b038211612ad4576001600160401b03821643109190565b506001905f90565b50505f905f90565b9081602091031261282f57516001600160401b038116810361282f5790565b3560ff8116810361282f5790565b903590601e198136030182121561282f57018035906001600160401b03821161282f5760200191813603831361282f57565b6001600160401b0381116129b057601f01601f191660200190565b600954811015612b045760095f5260205f2001905f90565b356001600160a01b038116810361282f5790565b356001600160801b038116810361282f5790565b600b545f91600c5482146132e8576064820693845f52600d60205260405f2054905f19821480156132de575b6132c95780159384156132d7575f19935b60408051602081019182529590926001600160a01b03612d11846128b2565b1660608801526020830135608088018190529960408401956001600160a01b03612d3a886128b2565b1660a08a01526060850199612d4e8b6128dc565b6001600160801b031660c08b01526080860198612d6a8a6128dc565b6001600160801b031660e08c015260a08701356101008c015260c0870197612d918961291c565b6001600160401b03166101208d015260e088019b612dae8d61291c565b6001600160401b0316610140820152806101008a0198612dce8a8c6139d9565b610160840161014090526101a0840190612de792612a57565b612df56101208d018d6139d9565b848303605f1901610180860152612e0c9291612a57565b90604083015203601f1981018252612e2490826129fa565b519020036132c957156132b657505f52600d6020525f1960405f205560018101809111612ad457600b555b612e5882612c8d565b946001600160401b03612e6a88612aa3565b1615613106576001600160801b03612e8182612ca1565b166130e1575b50629896806001600160401b03612e9d85612aa3565b1611613074576001600160401b03612eb484612aa3565b16612f5957505050916001600160801b035f516020613ae65f395f51905f529492612f0e612f0886612efa612eea606099612c8d565b612ef389612ca1565b9086613966565b159586612f36575b50612c8d565b94612ca1565b90604051975060018060a01b0316875216602086015215604085015260018060a01b031692a3565b612f5390612f4c612f468a612ca1565b91612aa3565b9086613a0a565b5f612f02565b612f7e612f6585612c8d565b91612f78612f728a612ca1565b95612aa3565b93612c28565b9092303b1561282f57604051625d97ef60e01b81526001600160a01b03808916600483015290931660248401526001600160801b03949094166044830152606482018a90526001600160401b0393909316608482015260c060a4820152915f9183918291612ff09160c4840191612a57565b038183305af19081613035575b505f516020613ae65f395f51905f529492612f0e612f08606096946001600160801b0394155f1461302e5789612efa565b6001612efa565b6001600160801b0391965092612f0e612f08606096946130645f5f516020613ae65f395f51905f529a986129fa565b5f99945094965050509294612ffd565b505050839194506130bc6130b66001600160801b03926130b16060966130aa612f465f516020613ae65f395f51905f529a612ca1565b908a613a0a565b612c8d565b92612ca1565b604080516001600160a01b0397881681529290911660208301525f90820152931692a3565b6130ff906130f860018060a01b035f541691612ca1565b9087613966565b505f612e87565b5050935050935050613119919350612c8d565b613121612b18565b926001600160801b0361313382612ca1565b166001600160801b0385161161329b575b8361315161315692612ca1565b613362565b906001600160801b03841661327e575b6131798261317385612c8d565b83613966565b156131ef577f0f7ef08806234f85aaee43d3ba4589c3bc6d5ac3fc8edd56fc3d91cc7553bdcb926131ea906001600160a01b03906131b690612c8d565b1694604051938493849160409194936001600160801b038092606086019760018060a01b0316865216602085015216910152565b0390a2565b6001600160a01b0381165f908152600a602052604090207f5fea28d0adb7d877ae3259768f41ad6741aa1784c4475746dd931364f62e68a1936131ea9161323582612c8d565b60018060a01b03165f5260205260405f206001600160801b0361325b8682845416613342565b82546001600160801b03191691161790556001600160a01b03906131b690612c8d565b5f546132959085906001600160a01b031683613966565b50613166565b6131519350806132ad61315692612ca1565b94509050613144565b91505f52600d60205260405f2055612e4f565b626aee3160e51b5f5260045ffd5b8193612cf2565b505f198114612ce1565b63d7fa91d160e01b5f5260045ffd5b6001600160a01b03165f9081526008602052604090205460ff8116156133335760081c60ff161561332457565b63dec712ef60e01b5f5260045ffd5b631fcf8c4760e11b5f5260045ffd5b906001600160801b03809116911601906001600160801b038211612ad457565b906001600160801b03809116911603906001600160801b038211612ad457565b909161338c612b61565b926001600160801b036133a66133a0612b18565b86613342565b16906001600160801b03811691821061349c57846133c391613362565b6040516323b872dd60e01b81523360048201523060248201526044810192909252926001600160a01b03166020826064815f855af191821561282457859261347f575b506001600160801b038216613419575050565b5f805460405163a9059cbb60e01b81526001600160a01b0390911660048201526001600160801b0393909316602484015260209183916044918391905af18015612824576134645750565b61347c9060203d60201161099f5761099181836129fa565b50565b6134979060203d60201161099f5761099181836129fa565b613406565b636ba4a1c760e01b5f5260045ffd5b6040519060a060208301935f8552600180831b038151166040850152600180831b036020820151166060850152600180831b0360408201511660808501526001600160801b0360608201511682850152600180831b0360808201511660c0850152015160e0830152610100820152610100815261352a610120826129fa565b51902090565b6005556006546135486001600160401b038216612ab7565b67ffffffffffffffff199091166001600160401b0382161760065590565b3d15613590573d9061357782612c5a565b9161358560405193846129fa565b82523d5f602084013e565b606090565b905f80809360405160208101918252602081526135b36040826129fa565b519071f90827f1c53a10cb7a02335b1753200029355afa6135d2613566565b90806135f7575b6135e05750565b90915060208180518101031261282f576020015190565b506020815110156135d9565b801561365157600c5490600b548203828111612ad4576064111561364257606482065f52600d60205260405f205560018101808211612ad457600c5590565b632764e20b60e01b5f5260045ffd5b505f1990565b60208183031261282f578051906001600160401b03821161282f570181601f8201121561282f5780519061368a82612c5a565b9261369860405194856129fa565b8284526020838301011161282f57815f9260208093018386015e8301015290565b6040516136c5816129df565b600180825260208083019182526001600160a01b039093165f8181526008948590526040902092518354925161ffff1990931660ff911515919091161791151590931b61ff0016179055600954600160401b8110156129b05780600161372e9201600955612c75565b81546001600160a01b0360039290921b91821b19169083901b1790556040516306fdde0360e01b81525f81600481855afa908115612824575f91613857575b506040516395d89b4160e01b81525f81600481865afa908115612824575f9161383d575b5060405163e5a6b10f60e01b8152915f83600481875afa928315612824577f4ac4dcc08b0c26c3fb6b58c64c1392b7934b1ce6b0382a5986ea5c3de795e053936137f9936131ea925f92613815575b5061380790604051958695606087526060870190612a1b565b908582036020870152612a1b565b908382036040850152612a1b565b613807919250613836903d805f833e61382e81836129fa565b810190613657565b91906137e0565b61385191503d805f833e61382e81836129fa565b5f613791565b61386b91503d805f833e61382e81836129fa565b5f61376d565b60ff1660028114908115613883575090565b600391501490565b60208151910151906020811061389f575090565b5f199060200360031b1b1690565b80158015613956575b613945575f9081906401000003d0199060079082908181800909086040516020810191602083526020604083015260206060830152608082015263800001e9600160ff1b0360a08201526401000003d01960c082015260c0815261391b60e0826129fa565b519060055afa613929613566565b9015801561394a575b6139455761394160019161388b565b1490565b505f90565b50602081511415613932565b506401000003d0198110156138b6565b60405163a9059cbb60e01b81526001600160a01b0392831660048201526001600160801b03939093166024840152602091839160449183915f91165af15f91816139b8575b506139b557505f90565b90565b6139d291925060203d60201161099f5761099181836129fa565b905f6139ab565b9035601e198236030181121561282f5701602081359101916001600160401b03821161282f57813603831361282f57565b909160606001600160401b037fadf6f2901dd7af2f28a594f47a925894a08d4de10609dff591a80642648775c5921693613a856001600160801b0360405195613a5287612995565b60018060a01b031692838752306020880152876040880152169485848201525f60808201525f60a08201526005546134ab565b9384600555600654906001600160401b03613aa1818416612ab7565b1680926001600160401b0319161760065560405192835260208301526040820152a356febb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd65042ea6dad60c26f055e80ec401b3437c854ed586a0704d305bb4e9ea4518cfa26469706673582212207fec8ab4d30524026f3986e8ca8a1b5c7504ad7d57169e3486d8dbaef16ee49264736f6c63430008230033a26469706673582212207d3b68e360d94a251af4055f973c1afc593fb1ed1096c77f254be5e6b140e12264736f6c63430008230033" } diff --git a/crates/node/src/dev.rs b/crates/node/src/dev.rs index 5a1f71d3e..24408c52f 100644 --- a/crates/node/src/dev.rs +++ b/crates/node/src/dev.rs @@ -85,8 +85,6 @@ pub async fn provision_zone(config: ProvisionConfig) -> eyre::Result eyre::Result eyre::Result eyre::Result { - let specs_dir = - std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../../specs/ref-impls/out"); - let path = specs_dir.join(format!("{contract}.sol/{contract}.json")); - let json = std::fs::read_to_string(&path).wrap_err_with(|| { - format!("{contract} artifact not found – run `forge build` in specs/ref-impls") - })?; - let artifact: serde_json::Value = serde_json::from_str(&json)?; - let mut bytecode = alloy_primitives::hex::decode( - artifact["deployedBytecode"]["object"] - .as_str() - .ok_or_else(|| eyre::eyre!("missing deployed bytecode in {contract} artifact"))?, - )?; - let references = artifact["deployedBytecode"]["immutableReferences"] - .as_object() - .ok_or_else(|| eyre::eyre!("missing immutable references in {contract} artifact"))?; - let mut patched = 0; - for reference in references.values().flat_map(|value| { - value - .as_array() - .into_iter() - .flat_map(|references| references.iter()) - }) { - let start = reference["start"] - .as_u64() - .ok_or_else(|| eyre::eyre!("invalid immutable start in {contract} artifact"))? - as usize; - let length = reference["length"] - .as_u64() - .ok_or_else(|| eyre::eyre!("invalid immutable length in {contract} artifact"))? - as usize; - eyre::ensure!(length == 32, "unexpected immutable size in {contract}"); - bytecode[start + 12..start + length].copy_from_slice(address.as_slice()); - patched += 1; - } - eyre::ensure!(patched > 0, "no immutable references found in {contract}"); - Ok(bytecode.into()) -} - fn install_reference_zone_factory(genesis: &mut Genesis, owner: Address) -> eyre::Result<()> { - const VERIFIER_ADDRESS: Address = address!("0x5aF2000000000000000000000000000000000001"); - const MESSENGER_ADDRESS: Address = address!("0x5aF2000000000000000000000000000000000002"); + use tempo_zone_contracts::{ + ZONE_MESSENGER_ADDRESS, ZONE_PORTAL_IMPL_ADDRESS, ZONE_VERIFIER_ADDRESS, + }; let one = B256::with_last_byte(1); let mut factory_storage = BTreeMap::new(); factory_storage.insert(B256::ZERO, one); factory_storage.insert( - keccak256((VERIFIER_ADDRESS, U256::from(3)).abi_encode()), - one, - ); - factory_storage.insert( - B256::with_last_byte(4), - B256::left_padding_from(VERIFIER_ADDRESS.as_slice()), - ); - factory_storage.insert( - B256::with_last_byte(5), - B256::left_padding_from(MESSENGER_ADDRESS.as_slice()), - ); - factory_storage.insert( - B256::with_last_byte(6), + B256::with_last_byte(3), B256::left_padding_from(owner.as_slice()), ); - factory_storage.insert(B256::with_last_byte(7), B256::with_last_byte(3)); genesis.alloc.insert( ZONE_FACTORY_ADDRESS, GenesisAccount::default() - .with_nonce(Some(3)) + .with_nonce(Some(1)) .with_code(Some(forge_deployed_bytecode("ZoneFactory")?)) .with_storage(Some(factory_storage)), ); genesis.alloc.insert( - VERIFIER_ADDRESS, + ZONE_VERIFIER_ADDRESS, GenesisAccount::default() .with_nonce(Some(1)) .with_code(Some(forge_deployed_bytecode("Verifier")?)), ); genesis.alloc.insert( - MESSENGER_ADDRESS, + ZONE_PORTAL_IMPL_ADDRESS, + GenesisAccount::default() + .with_nonce(Some(1)) + .with_code(Some(forge_deployed_bytecode("ZonePortal")?)), + ); + genesis.alloc.insert( + ZONE_MESSENGER_ADDRESS, GenesisAccount::default() .with_nonce(Some(1)) - .with_code(Some(forge_deployed_bytecode_with_address_immutable( - "ZoneMessenger", - ZONE_FACTORY_ADDRESS, - )?)), + .with_code(Some(forge_deployed_bytecode("ZoneMessenger")?)), ); Ok(()) } @@ -1271,13 +1220,11 @@ impl L1TestNode { l1_header.encode(&mut rlp_buf); let genesis_tempo_block_hash = keccak256(&rlp_buf); - let verifier_address = factory.verifier().call().await?; let receipt = factory .createZone(ZoneFactory::CreateZoneParams { admin, initialToken: PATH_USD_ADDRESS, sequencer, - verifier: verifier_address, zoneParams: ZoneFactory::ZoneParams { genesisBlockHash: B256::ZERO, genesisTempoBlockHash: genesis_tempo_block_hash, diff --git a/docs/ZONES.md b/docs/ZONES.md index 68c4fd5ca..7e0784768 100644 --- a/docs/ZONES.md +++ b/docs/ZONES.md @@ -66,7 +66,7 @@ cargo run --release --bin tempo-zone -- dev \ --l1.rpc-url ws://127.0.0.1:8545 ``` -This provisions a new ZoneFactory and portal, writes the generated zone files to +This uses the protocol-managed ZoneFactory to create a portal, writes the generated zone files to `/tmp/tempo-zone-dev`, and serves the zone HTTP RPC at `http://127.0.0.1:9545`. Older Anvil builds are rejected because they mine Ethereum header hashes and only @@ -141,7 +141,7 @@ View on explorer: `https://explore.moderato.tempo.xyz/address/` ### 4. Create the Zone on L1 -This deploys a ZonePortal on L1, wired to the factory's shared ZoneMessenger, and generates the zone's genesis file: +This creates a ZonePortal through the protocol-managed factory, wired to the shared ZoneMessenger, and generates the zone's genesis file: ```bash export PRIVATE_KEY="$SEQUENCER_KEY" @@ -555,47 +555,27 @@ Zones inherit the Tempo L1 EVM but replace, disable, or pass through each precom | Contract | Address | |----------|---------| | pathUSD (TIP-20) | `0x20C0000000000000000000000000000000000000` | -| ZoneFactory (moderato) | `0xd97052545B978cc79Dd083912C72CA62f889dFaF` | +| ZoneFactory | `0x5aF2000000000000000000000000000000000000` | +| ZonePortal implementation | `0x5AD1000000000000000000000000000000000000` | +| Zone verifier | `0x5a56000000000000000000000000000000000000` | +| ZoneMessenger | `0x5A4d000000000000000000000000000000000000` | The xtasks use this Moderato `ZoneFactory` as their built-in default: `create-zone` and `zone-info` point at it automatically, and `deploy-router` uses `zoneFactory` from `zone.json` before falling back to this address. Pass `--zone-factory` or set `ZONE_FACTORY` to override it. -### Deploying a New ZoneFactory +### Verifying the ZoneFactory -Deploy a fresh shared factory when the Solidity `ZoneFactory`, `ZonePortal`, `ZoneMessenger`, or verifier ABI changes in a way that existing factory deployments cannot serve. +TIP-1091 makes the factory and its shared dependencies protocol-managed accounts. Verify them at their fixed addresses: ```bash -cd specs/ref-impls -export ETH_RPC_URL=https://rpc.moderato.tempo.xyz -export PRIVATE_KEY= - -forge build -forge create --broadcast --rpc-url "$ETH_RPC_URL" --private-key "$PRIVATE_KEY" src/tempo/ZoneFactory.sol:ZoneFactory -``` - -The `--private-key "$PRIVATE_KEY"` form is useful for controlled non-interactive deployments. For manual deployments, prefer replacing it with `--interactive` and paste the key at Foundry's prompt so the key is not written into shell history or process arguments. - -After deployment, capture the `Deployed to` address and transaction hash, then verify the contract: - -```bash -export ZONE_FACTORY=0x... +export ZONE_FACTORY=0x5aF2000000000000000000000000000000000000 cast code "$ZONE_FACTORY" --rpc-url "$ETH_RPC_URL" -cast call "$ZONE_FACTORY" "zoneCount()(uint32)" --rpc-url "$ETH_RPC_URL" -cast call "$ZONE_FACTORY" "verifier()(address)" --rpc-url "$ETH_RPC_URL" -cast call "$ZONE_FACTORY" "messenger()(address)" --rpc-url "$ETH_RPC_URL" +cast call "$ZONE_FACTORY" "nextZoneId()(uint32)" --rpc-url "$ETH_RPC_URL" +cast code 0x5AD1000000000000000000000000000000000000 --rpc-url "$ETH_RPC_URL" +cast code 0x5a56000000000000000000000000000000000000 --rpc-url "$ETH_RPC_URL" +cast code 0x5A4d000000000000000000000000000000000000 --rpc-url "$ETH_RPC_URL" ``` -`zoneCount()` should be `0` on a fresh deployment, and `verifier()` and `messenger()` should return the contracts deployed by the factory constructor. Update `MODERATO_ZONE_FACTORY` in `xtask/src/zone_utils.rs`, the Key Addresses table above, and any other `rg` hits for the previous address. - -Current deployment: - -| Field | Value | -|-------|-------| -| Address | `0xd97052545B978cc79Dd083912C72CA62f889dFaF` | -| Transaction | `0xb99ae18e4223b4176fac475dfa6fdfe2c43da9e95777bd5ff0387b6b20b99b44` | -| Block | `26546762` | -| Deployed | `2026-07-14 18:26:32 UTC` | - ### Zone Node CLI Options | Flag | Default | Description | diff --git a/specs/ref-impls/src/interfaces/IZone.sol b/specs/ref-impls/src/interfaces/IZone.sol index e1e787faf..7c53331d4 100644 --- a/specs/ref-impls/src/interfaces/IZone.sol +++ b/specs/ref-impls/src/interfaces/IZone.sol @@ -3,6 +3,10 @@ pragma solidity ^0.8.13; // Protocol-managed ZoneFactory precompile defined by TIP-1091. address constant ZONE_FACTORY_ADDRESS = 0x5aF2000000000000000000000000000000000000; +bytes12 constant ZONE_PORTAL_PREFIX = 0x5AD000000000000000000000; +address constant ZONE_PORTAL_IMPL_ADDRESS = 0x5AD1000000000000000000000000000000000000; +address constant ZONE_VERIFIER_ADDRESS = 0x5a56000000000000000000000000000000000000; +address constant ZONE_MESSENGER_ADDRESS = 0x5A4d000000000000000000000000000000000000; /// @title IZoneToken /// @notice Interface for the zone's zone token (TIP-20 with mint/burn for system) @@ -27,7 +31,6 @@ struct ZoneInfo { address initialToken; // first TIP-20 enabled at zone creation (additional tokens enabled via enableToken) address admin; address sequencer; - address verifier; bytes32 genesisBlockHash; bytes32 genesisTempoBlockHash; uint64 genesisTempoBlockNumber; @@ -420,7 +423,6 @@ interface IZoneFactory { address initialToken; // first TIP-20 to enable (sequencer can enable more later) address admin; address sequencer; - address verifier; ZoneParams zoneParams; string rpcUrl; } @@ -442,7 +444,6 @@ interface IZoneFactory { error NotOwner(); error InvalidAdmin(); error InvalidSequencer(); - error InvalidVerifier(); error InsufficientGas(); error ZoneIdOverflow(); @@ -452,26 +453,16 @@ interface IZoneFactory { /// @notice Transfers zone-creation authority to `newOwner`. function transferOwnership(address newOwner) external; - /// @notice Returns whether a verifier contract is approved for zone creation. - /// @param verifier The verifier contract address to check. - /// @return valid True if `verifier` can be passed to `createZone`. - function isValidVerifier(address verifier) external view returns (bool); - - /// @notice Returns the default verifier deployed by the factory. - /// @return verifier The default verifier contract address. - function verifier() external view returns (address); - /// @notice Creates a new zone and deploys its portal contract. - /// @param params The initial token, sequencer, verifier, and genesis parameters for the zone. + /// @param params The initial token, sequencer, and genesis parameters for the zone. /// @return zoneId The newly assigned zone ID. /// @return portal The deployed portal address for the new zone. function createZone(CreateZoneParams calldata params) external returns (uint32 zoneId, address portal); - /// @notice Returns the number of zones created so far. - /// @return count The total number of created zones, excluding reserved zone ID 0. - function zoneCount() external view returns (uint32); + /// @notice Returns the next zone ID that will be assigned. + function nextZoneId() external view returns (uint32); /// @notice Returns the stored metadata for a zone. /// @param zoneId The zone ID to query. @@ -483,10 +474,6 @@ interface IZoneFactory { /// @return isPortal True if `portal` was created by this factory. function isZonePortal(address portal) external view returns (bool); - /// @notice Returns the shared messenger used for withdrawal callbacks. - /// @return messenger The shared messenger contract address. - function messenger() external view returns (address); - } /// @notice Per-token configuration in the portal's token registry @@ -612,6 +599,7 @@ interface IZonePortal { error NotAdmin(); error NotFactory(); error AlreadyInitialized(); + error MustDelegateCall(); error NotPendingSequencer(); error NotPendingAdmin(); error InvalidProof(); diff --git a/specs/ref-impls/src/tempo/SwapAndDepositRouter.sol b/specs/ref-impls/src/tempo/SwapAndDepositRouter.sol index 882ac7246..db3c0d8ad 100644 --- a/specs/ref-impls/src/tempo/SwapAndDepositRouter.sol +++ b/specs/ref-impls/src/tempo/SwapAndDepositRouter.sol @@ -6,6 +6,7 @@ import { IWithdrawalReceiver, IZoneFactory, IZonePortal, + ZONE_MESSENGER_ADDRESS, ZoneInfo } from "../interfaces/IZone.sol"; import { IStablecoinDEX } from "tempo-std/interfaces/IStablecoinDEX.sol"; @@ -73,7 +74,7 @@ contract SwapAndDepositRouter is IWithdrawalReceiver { external returns (bytes4) { - if (msg.sender != zoneFactory.messenger()) { + if (msg.sender != ZONE_MESSENGER_ADDRESS) { revert UnauthorizedMessenger(); } diff --git a/specs/ref-impls/src/tempo/ZoneFactory.sol b/specs/ref-impls/src/tempo/ZoneFactory.sol index 9e81b69bb..71baf6530 100644 --- a/specs/ref-impls/src/tempo/ZoneFactory.sol +++ b/specs/ref-impls/src/tempo/ZoneFactory.sol @@ -1,9 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import { IZoneFactory, ZoneInfo } from "../interfaces/IZone.sol"; -import { Verifier } from "./Verifier.sol"; -import { ZoneMessenger } from "./ZoneMessenger.sol"; +import { + IZoneFactory, + ZONE_MESSENGER_ADDRESS, + ZONE_VERIFIER_ADDRESS, + ZoneInfo +} from "../interfaces/IZone.sol"; import { ZonePortal } from "./ZonePortal.sol"; import { StdPrecompiles } from "tempo-std/StdPrecompiles.sol"; import { ITIP20Factory } from "tempo-std/interfaces/ITIP20Factory.sol"; @@ -22,34 +25,12 @@ contract ZoneFactory is IZoneFactory { /// @notice Next zone ID to be assigned /// @dev Starts at 1, reserving zone ID 0 for potential future use (e.g., mainnet as zone 0) - uint32 internal _nextZoneId = 1; + uint32 public nextZoneId = 1; mapping(uint32 => ZoneInfo) internal _zones; mapping(address => bool) internal _isZonePortal; - mapping(address => bool) internal _validVerifiers; - address internal _verifier; - address internal _messenger; address public owner; - /// @notice Tracks deployment count for CREATE address prediction - /// @dev Contracts start with nonce 1, not 0. Nonce 1 is used by the Verifier deployment, - /// nonce 2 by the shared ZoneMessenger, so zone deployments start at nonce 3. - uint256 internal _deploymentNonce = 3; - - /*////////////////////////////////////////////////////////////// - CONSTRUCTOR - //////////////////////////////////////////////////////////////*/ - - constructor() { - owner = msg.sender; - emit OwnershipTransferred(address(0), msg.sender); - - address v = address(new Verifier()); - _validVerifiers[v] = true; - _verifier = v; - _messenger = address(new ZoneMessenger(address(this))); - } - /*////////////////////////////////////////////////////////////// ZONE CREATION //////////////////////////////////////////////////////////////*/ @@ -66,17 +47,11 @@ contract ZoneFactory is IZoneFactory { } if (params.admin == address(0)) revert InvalidAdmin(); if (params.sequencer == address(0)) revert InvalidSequencer(); - if (!_validVerifiers[params.verifier]) revert InvalidVerifier(); if (gasleft() < ZONE_CREATION_GAS) revert InsufficientGas(); - zoneId = _nextZoneId; + zoneId = nextZoneId; if (zoneId == type(uint32).max) revert ZoneIdOverflow(); - _nextZoneId = zoneId + 1; - - uint256 currentNonce = _deploymentNonce; - _deploymentNonce += 1; // We'll deploy 1 contract - - address predictedPortal = _computeCreateAddress(address(this), currentNonce); + nextZoneId = zoneId + 1; // Deploy and atomically initialize the portal. TIP-1091 fixes this factory's address as // the portal's only initializer authority. @@ -84,19 +59,16 @@ contract ZoneFactory is IZoneFactory { portalContract.initialize( zoneId, params.initialToken, - _messenger, + ZONE_MESSENGER_ADDRESS, params.admin, params.sequencer, - params.verifier, + ZONE_VERIFIER_ADDRESS, params.zoneParams.genesisBlockHash, params.zoneParams.genesisTempoBlockNumber, params.rpcUrl ); portal = address(portalContract); - // Verify our prediction was correct - require(portal == predictedPortal, "Portal address mismatch - nonce tracking error"); - // Store zone info _zones[zoneId] = ZoneInfo({ zoneId: zoneId, @@ -104,7 +76,6 @@ contract ZoneFactory is IZoneFactory { initialToken: params.initialToken, admin: params.admin, sequencer: params.sequencer, - verifier: params.verifier, genesisBlockHash: params.zoneParams.genesisBlockHash, genesisTempoBlockHash: params.zoneParams.genesisTempoBlockHash, genesisTempoBlockNumber: params.zoneParams.genesisTempoBlockNumber, @@ -119,7 +90,7 @@ contract ZoneFactory is IZoneFactory { params.initialToken, params.admin, params.sequencer, - params.verifier, + ZONE_VERIFIER_ADDRESS, params.zoneParams.genesisBlockHash, params.zoneParams.genesisTempoBlockHash, params.zoneParams.genesisTempoBlockNumber @@ -136,43 +107,10 @@ contract ZoneFactory is IZoneFactory { emit OwnershipTransferred(previousOwner, newOwner); } - /// @notice Compute the address of a contract deployed with CREATE - /// @dev address = keccak256(rlp([sender, nonce]))[12:] - function _computeCreateAddress(address deployer, uint256 nonce) - internal - pure - returns (address) - { - bytes memory data; - if (nonce == 0x00) { - data = abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, bytes1(0x80)); - } else if (nonce <= 0x7f) { - data = abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, uint8(nonce)); - } else if (nonce <= 0xff) { - data = - abi.encodePacked(bytes1(0xd7), bytes1(0x94), deployer, bytes1(0x81), uint8(nonce)); - } else if (nonce <= 0xffff) { - data = - abi.encodePacked(bytes1(0xd8), bytes1(0x94), deployer, bytes1(0x82), uint16(nonce)); - } else if (nonce <= 0xffffff) { - data = - abi.encodePacked(bytes1(0xd9), bytes1(0x94), deployer, bytes1(0x83), uint24(nonce)); - } else { - data = - abi.encodePacked(bytes1(0xda), bytes1(0x94), deployer, bytes1(0x84), uint32(nonce)); - } - return address(uint160(uint256(keccak256(data)))); - } - /*////////////////////////////////////////////////////////////// VIEWS //////////////////////////////////////////////////////////////*/ - /// @notice Returns the number of zones created (not including reserved zone 0) - function zoneCount() external view returns (uint32) { - return _nextZoneId - 1; - } - function zones(uint32 zoneId) external view returns (ZoneInfo memory) { return _zones[zoneId]; } @@ -181,16 +119,4 @@ contract ZoneFactory is IZoneFactory { return _isZonePortal[portal]; } - function isValidVerifier(address v) external view returns (bool) { - return _validVerifiers[v]; - } - - function verifier() external view returns (address) { - return _verifier; - } - - function messenger() external view returns (address) { - return _messenger; - } - } diff --git a/specs/ref-impls/src/tempo/ZoneMessenger.sol b/specs/ref-impls/src/tempo/ZoneMessenger.sol index 216774c9e..3686f97a4 100644 --- a/specs/ref-impls/src/tempo/ZoneMessenger.sol +++ b/specs/ref-impls/src/tempo/ZoneMessenger.sol @@ -5,6 +5,7 @@ import { IWithdrawalReceiver, IZoneFactory, IZoneMessenger, + ZONE_FACTORY_ADDRESS, ZoneInfo } from "../interfaces/IZone.sol"; import { ITIP20 } from "tempo-std/interfaces/ITIP20.sol"; @@ -13,7 +14,7 @@ import { ITIP20 } from "tempo-std/interfaces/ITIP20.sol"; /// @notice Shared withdrawal callback sender for all zones created by one ZoneFactory. contract ZoneMessenger is IZoneMessenger { - IZoneFactory public immutable zoneFactory; + IZoneFactory public constant zoneFactory = IZoneFactory(ZONE_FACTORY_ADDRESS); uint256 internal _relayReentrancyStatus; @@ -22,10 +23,6 @@ contract ZoneMessenger is IZoneMessenger { error CallbackRejected(); error ReentrantRelay(); - constructor(address _zoneFactory) { - zoneFactory = IZoneFactory(_zoneFactory); - } - modifier nonReentrantRelay() { if (_relayReentrancyStatus != 0) revert ReentrantRelay(); _relayReentrancyStatus = 1; diff --git a/specs/ref-impls/src/tempo/ZonePortal.sol b/specs/ref-impls/src/tempo/ZonePortal.sol index e19fa8714..e4b18bf6d 100644 --- a/specs/ref-impls/src/tempo/ZonePortal.sol +++ b/specs/ref-impls/src/tempo/ZonePortal.sol @@ -17,7 +17,8 @@ import { QueuedDeposit, TokenConfig, Withdrawal, - ZONE_FACTORY_ADDRESS + ZONE_FACTORY_ADDRESS, + ZONE_PORTAL_IMPL_ADDRESS } from "../interfaces/IZone.sol"; import { getBlockHash } from "../libraries/BlockHashHistory.sol"; import { DepositQueueLib } from "../libraries/DepositQueueLib.sol"; @@ -152,6 +153,7 @@ contract ZonePortal is IZonePortal { string calldata _rpcUrl ) external + onlyDelegateCall { if (msg.sender != ZONE_FACTORY_ADDRESS) revert NotFactory(); if (_initialized) revert AlreadyInitialized(); @@ -174,6 +176,11 @@ contract ZonePortal is IZonePortal { MODIFIERS //////////////////////////////////////////////////////////////*/ + modifier onlyDelegateCall() { + if (address(this) == ZONE_PORTAL_IMPL_ADDRESS) revert MustDelegateCall(); + _; + } + modifier onlySequencer() { if (msg.sender != sequencer) revert NotSequencer(); _; diff --git a/specs/ref-impls/test/BaseTest.t.sol b/specs/ref-impls/test/BaseTest.t.sol index a2c9d19d4..0e7b35655 100644 --- a/specs/ref-impls/test/BaseTest.t.sol +++ b/specs/ref-impls/test/BaseTest.t.sol @@ -1,7 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import { ZONE_FACTORY_ADDRESS, ZONE_TX_CONTEXT } from "../src/interfaces/IZone.sol"; +import { + ZONE_FACTORY_ADDRESS, + ZONE_MESSENGER_ADDRESS, + ZONE_TX_CONTEXT, + ZONE_VERIFIER_ADDRESS +} from "../src/interfaces/IZone.sol"; import { EIP2935 } from "../src/libraries/BlockHashHistory.sol"; import { Verifier } from "../src/tempo/Verifier.sol"; import { ZoneFactory } from "../src/tempo/ZoneFactory.sol"; @@ -136,27 +141,14 @@ contract BaseTest is Test { /// @notice Installs the deployable reference factory at TIP-1091's fixed precompile address. function _deployZoneFactory() internal returns (ZoneFactory zoneFactory) { - Verifier verifier = new Verifier(); - ZoneMessenger messenger = new ZoneMessenger(ZONE_FACTORY_ADDRESS); - vm.etch(ZONE_FACTORY_ADDRESS, type(ZoneFactory).runtimeCode); - vm.setNonce(ZONE_FACTORY_ADDRESS, 3); + vm.etch(ZONE_VERIFIER_ADDRESS, type(Verifier).runtimeCode); + vm.etch(ZONE_MESSENGER_ADDRESS, type(ZoneMessenger).runtimeCode); + vm.setNonce(ZONE_FACTORY_ADDRESS, 1); vm.store(ZONE_FACTORY_ADDRESS, bytes32(uint256(0)), bytes32(uint256(1))); vm.store( - ZONE_FACTORY_ADDRESS, - keccak256(abi.encode(address(verifier), uint256(3))), - bytes32(uint256(1)) - ); - vm.store( - ZONE_FACTORY_ADDRESS, bytes32(uint256(4)), bytes32(uint256(uint160(address(verifier)))) - ); - vm.store( - ZONE_FACTORY_ADDRESS, bytes32(uint256(5)), bytes32(uint256(uint160(address(messenger)))) - ); - vm.store( - ZONE_FACTORY_ADDRESS, bytes32(uint256(6)), bytes32(uint256(uint160(address(this)))) + ZONE_FACTORY_ADDRESS, bytes32(uint256(3)), bytes32(uint256(uint160(address(this)))) ); - vm.store(ZONE_FACTORY_ADDRESS, bytes32(uint256(7)), bytes32(uint256(3))); zoneFactory = ZoneFactory(ZONE_FACTORY_ADDRESS); } diff --git a/specs/ref-impls/test/tempo/SwapAndDepositRouter.t.sol b/specs/ref-impls/test/tempo/SwapAndDepositRouter.t.sol index 3bf0ef817..dddbed0d6 100644 --- a/specs/ref-impls/test/tempo/SwapAndDepositRouter.t.sol +++ b/specs/ref-impls/test/tempo/SwapAndDepositRouter.t.sol @@ -6,6 +6,7 @@ import { IWithdrawalReceiver, IZoneFactory, IZonePortal, + ZONE_MESSENGER_ADDRESS, ZoneInfo } from "../../src/interfaces/IZone.sol"; import { SwapAndDepositRouter } from "../../src/tempo/SwapAndDepositRouter.sol"; @@ -50,16 +51,10 @@ contract MockZoneFactoryForRouter { mapping(address => bool) public portalMap; mapping(uint32 => ZoneInfo) internal _zones; - address public messenger; - function setPortal(address portal, bool registered) external { portalMap[portal] = registered; } - function setMessenger(address _messenger) external { - messenger = _messenger; - } - function setSourcePortal(uint32 zoneId, address portal) external { _zones[zoneId].zoneId = zoneId; _zones[zoneId].portal = portal; @@ -75,8 +70,6 @@ contract MockZoneFactoryForRouter { } -contract MockZoneMessengerForRouter { } - contract MockZonePortalForRouter { mapping(address => bool) public enabledTokens; @@ -144,7 +137,6 @@ contract SwapAndDepositRouterTest is BaseTest { SwapAndDepositRouter public router; MockStablecoinDEXForRouter public mockDEX; MockZoneFactoryForRouter public mockFactory; - MockZoneMessengerForRouter public mockMessenger; MockZonePortalForRouter public mockPortal; MockZonePortalForRouter public mockPortal2; @@ -159,13 +151,11 @@ contract SwapAndDepositRouterTest is BaseTest { mockDEX = new MockStablecoinDEXForRouter(); mockFactory = new MockZoneFactoryForRouter(); - mockMessenger = new MockZoneMessengerForRouter(); mockPortal = new MockZonePortalForRouter(); mockPortal2 = new MockZonePortalForRouter(); router = new SwapAndDepositRouter(address(mockDEX), address(mockFactory)); - mockFactory.setMessenger(address(mockMessenger)); mockFactory.setSourcePortal(SOURCE_ZONE_ID, sourcePortal); mockFactory.setPortal(address(mockPortal), true); mockFactory.setPortal(address(mockPortal2), true); @@ -248,7 +238,7 @@ contract SwapAndDepositRouterTest is BaseTest { address(pathUSD), address(mockPortal), alice, refundBurner, bytes32("memo"), 0 ); - vm.prank(address(mockMessenger)); + vm.prank(ZONE_MESSENGER_ADDRESS); vm.expectRevert(SwapAndDepositRouter.InvalidSourcePortal.selector); router.onWithdrawalReceived( SOURCE_ZONE_ID, address(0xBAD), senderTag, address(pathUSD), AMOUNT, data @@ -261,7 +251,7 @@ contract SwapAndDepositRouterTest is BaseTest { address(pathUSD), fakePortal, alice, refundBurner, bytes32("memo"), 0 ); - vm.prank(address(mockMessenger)); + vm.prank(ZONE_MESSENGER_ADDRESS); vm.expectRevert(SwapAndDepositRouter.InvalidTargetPortal.selector); router.onWithdrawalReceived( SOURCE_ZONE_ID, sourcePortal, senderTag, address(pathUSD), AMOUNT, data @@ -273,7 +263,7 @@ contract SwapAndDepositRouterTest is BaseTest { address(token1), address(mockPortal), alice, refundBurner, bytes32("memo"), 0 ); - vm.prank(address(mockMessenger)); + vm.prank(ZONE_MESSENGER_ADDRESS); vm.expectRevert(SwapAndDepositRouter.InvalidToken.selector); router.onWithdrawalReceived( SOURCE_ZONE_ID, sourcePortal, senderTag, address(pathUSD), AMOUNT, data @@ -285,7 +275,7 @@ contract SwapAndDepositRouterTest is BaseTest { address(pathUSD), address(mockPortal), alice, refundBurner, bytes32("hello"), 0 ); - vm.prank(address(mockMessenger)); + vm.prank(ZONE_MESSENGER_ADDRESS); bytes4 ret = router.onWithdrawalReceived( SOURCE_ZONE_ID, sourcePortal, senderTag, address(pathUSD), AMOUNT, data ); @@ -306,7 +296,7 @@ contract SwapAndDepositRouterTest is BaseTest { address(token1), address(mockPortal2), alice, refundBurner, bytes32("swap"), 900e6 ); - vm.prank(address(mockMessenger)); + vm.prank(ZONE_MESSENGER_ADDRESS); bytes4 ret = router.onWithdrawalReceived( SOURCE_ZONE_ID, sourcePortal, senderTag, address(pathUSD), AMOUNT, data ); @@ -324,7 +314,7 @@ contract SwapAndDepositRouterTest is BaseTest { bytes memory data = _buildEncryptedData(address(pathUSD), address(mockPortal), 0, payload, refundBurner, 0); - vm.prank(address(mockMessenger)); + vm.prank(ZONE_MESSENGER_ADDRESS); bytes4 ret = router.onWithdrawalReceived( SOURCE_ZONE_ID, sourcePortal, senderTag, address(pathUSD), AMOUNT, data ); @@ -345,7 +335,7 @@ contract SwapAndDepositRouterTest is BaseTest { address(token1), address(mockPortal2), 1, payload, refundBurner, 900e6 ); - vm.prank(address(mockMessenger)); + vm.prank(ZONE_MESSENGER_ADDRESS); bytes4 ret = router.onWithdrawalReceived( SOURCE_ZONE_ID, sourcePortal, senderTag, address(pathUSD), AMOUNT, data ); @@ -364,7 +354,7 @@ contract SwapAndDepositRouterTest is BaseTest { address(token1), address(mockPortal2), alice, refundBurner, bytes32("slip"), 900e6 ); - vm.prank(address(mockMessenger)); + vm.prank(ZONE_MESSENGER_ADDRESS); vm.expectRevert(IStablecoinDEX.InsufficientOutput.selector); router.onWithdrawalReceived( SOURCE_ZONE_ID, sourcePortal, senderTag, address(pathUSD), AMOUNT, data diff --git a/specs/ref-impls/test/tempo/ZoneBridge.t.sol b/specs/ref-impls/test/tempo/ZoneBridge.t.sol index 5870bbdfd..ff7b90d90 100644 --- a/specs/ref-impls/test/tempo/ZoneBridge.t.sol +++ b/specs/ref-impls/test/tempo/ZoneBridge.t.sol @@ -23,8 +23,11 @@ import { PORTAL_ENCRYPTION_KEYS_SLOT, QueuedDeposit, Withdrawal, + ZONE_FACTORY_ADDRESS, ZONE_INBOX, + ZONE_MESSENGER_ADDRESS, ZONE_OUTBOX, + ZONE_VERIFIER_ADDRESS, ZoneInfo, ZoneParams } from "../../src/interfaces/IZone.sol"; @@ -171,18 +174,18 @@ contract ZoneBridgeTest is BaseTest { // Deploy portal directly (bypass factory to avoid TIP20 prefix check), but use a // mock factory registry so the shared messenger can authenticate the source portal. - MockZoneFactoryForBridgeMessenger messengerFactory = new MockZoneFactoryForBridgeMessenger(); - ZoneMessenger messengerContract = new ZoneMessenger(address(messengerFactory)); + vm.etch(ZONE_FACTORY_ADDRESS, type(MockZoneFactoryForBridgeMessenger).runtimeCode); + MockZoneFactoryForBridgeMessenger messengerFactory = + MockZoneFactoryForBridgeMessenger(ZONE_FACTORY_ADDRESS); l1Portal = new ZonePortal(); - address verifier = l1Factory.verifier(); vm.prank(_ZONE_FACTORY); l1Portal.initialize( 1, // zoneId address(l2ZoneToken), // initialToken = MockZoneToken (NOT pathUSD) - address(messengerContract), + ZONE_MESSENGER_ADDRESS, admin, // admin sequencer, // sequencer - verifier, + ZONE_VERIFIER_ADDRESS, GENESIS_BLOCK_HASH, genesisTempoBlockNumber, "" diff --git a/specs/ref-impls/test/tempo/ZoneFactory.t.sol b/specs/ref-impls/test/tempo/ZoneFactory.t.sol index ae8f72d5e..ba4ad2460 100644 --- a/specs/ref-impls/test/tempo/ZoneFactory.t.sol +++ b/specs/ref-impls/test/tempo/ZoneFactory.t.sol @@ -1,7 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import { IZoneFactory, ZoneInfo, ZoneParams } from "../../src/interfaces/IZone.sol"; +import { + IZoneFactory, + ZONE_MESSENGER_ADDRESS, + ZONE_VERIFIER_ADDRESS, + ZoneInfo, + ZoneParams +} from "../../src/interfaces/IZone.sol"; import { ZoneFactory } from "../../src/tempo/ZoneFactory.sol"; import { ZonePortal } from "../../src/tempo/ZonePortal.sol"; import { BaseTest } from "../BaseTest.t.sol"; @@ -30,7 +36,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: address(pathUSD), admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -43,7 +48,7 @@ contract ZoneFactoryTest is BaseTest { assertEq(zoneId, 1); assertTrue(portal != address(0)); - assertEq(zoneFactory.zoneCount(), 1); + assertEq(zoneFactory.nextZoneId(), 2); assertTrue(zoneFactory.isZonePortal(portal)); ZoneInfo memory info = zoneFactory.zones(zoneId); @@ -52,7 +57,6 @@ contract ZoneFactoryTest is BaseTest { assertEq(info.initialToken, address(pathUSD)); assertEq(info.admin, admin); assertEq(info.sequencer, sequencer); - assertEq(info.verifier, zoneFactory.verifier()); assertEq(info.genesisBlockHash, GENESIS_BLOCK_HASH); assertEq(info.genesisTempoBlockHash, GENESIS_TEMPO_BLOCK_HASH); } @@ -62,7 +66,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: address(pathUSD), admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -101,7 +104,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: address(pathUSD), admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -112,7 +114,7 @@ contract ZoneFactoryTest is BaseTest { (uint32 zoneId, address portal) = zoneFactory.createZone(params); - address messengerAddr = zoneFactory.messenger(); + address messengerAddr = ZONE_MESSENGER_ADDRESS; assertTrue(messengerAddr != address(0)); // Verify portal references the messenger @@ -126,7 +128,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: address(pathUSD), admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -142,7 +143,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: address(pathUSD), admin: admin, sequencer: secondSequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: keccak256("genesis2"), genesisTempoBlockHash: keccak256("tempoGenesis2"), @@ -156,7 +156,7 @@ contract ZoneFactoryTest is BaseTest { assertEq(zoneId1, 1); assertEq(zoneId2, 2); assertTrue(portal1 != portal2); - assertEq(zoneFactory.zoneCount(), 2); + assertEq(zoneFactory.nextZoneId(), 3); assertTrue(zoneFactory.isZonePortal(portal1)); assertTrue(zoneFactory.isZonePortal(portal2)); @@ -164,8 +164,8 @@ contract ZoneFactoryTest is BaseTest { ZoneInfo memory info2 = zoneFactory.zones(zoneId2); assertEq(info1.sequencer, sequencer); assertEq(info2.sequencer, secondSequencer); - assertEq(ZonePortal(portal1).messenger(), zoneFactory.messenger()); - assertEq(ZonePortal(portal2).messenger(), zoneFactory.messenger()); + assertEq(ZonePortal(portal1).messenger(), ZONE_MESSENGER_ADDRESS); + assertEq(ZonePortal(portal2).messenger(), ZONE_MESSENGER_ADDRESS); } function test_createZone_emitsEvent() public { @@ -173,7 +173,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: address(pathUSD), admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -219,7 +218,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: address(0), admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -240,7 +238,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: notTip20, admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -258,7 +255,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: alice, // EOA, not a contract admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -280,7 +276,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: address(pathUSD), admin: address(0), sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -302,7 +297,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: address(pathUSD), admin: admin, sequencer: address(0), - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -315,34 +309,12 @@ contract ZoneFactoryTest is BaseTest { zoneFactory.createZone(params); } - /*////////////////////////////////////////////////////////////// - INVALID VERIFIER TESTS - //////////////////////////////////////////////////////////////*/ - - function test_createZone_revertsOnInvalidVerifier() public { - IZoneFactory.CreateZoneParams memory params = IZoneFactory.CreateZoneParams({ - initialToken: address(pathUSD), - admin: admin, - sequencer: sequencer, - verifier: address(0xdead), - zoneParams: ZoneParams({ - genesisBlockHash: GENESIS_BLOCK_HASH, - genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, - genesisTempoBlockNumber: uint64(block.number) - }), - rpcUrl: "" - }); - - vm.expectRevert(IZoneFactory.InvalidVerifier.selector); - zoneFactory.createZone(params); - } - /*////////////////////////////////////////////////////////////// VIEW TESTS //////////////////////////////////////////////////////////////*/ - function test_zoneCount_initiallyZero() public view { - assertEq(zoneFactory.zoneCount(), 0); + function test_nextZoneId_initiallyOne() public view { + assertEq(zoneFactory.nextZoneId(), 1); } function test_isZonePortal_returnsFalseForNonPortal() public view { @@ -367,7 +339,6 @@ contract ZoneFactoryTest is BaseTest { initialToken: address(pathUSD), admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -390,7 +361,7 @@ contract ZoneFactoryTest is BaseTest { zoneFactory.createZone{ gas: 14_000_000 }(p); } - // _nextZoneId is storage slot 0 (uint32, packed alone). + // nextZoneId is storage slot 0 (uint32, packed alone). function test_createZone_revertsOnZoneIdOverflow() public { IZoneFactory.CreateZoneParams memory p = _defaultParams(); vm.store(address(zoneFactory), bytes32(uint256(0)), bytes32(uint256(type(uint32).max))); @@ -411,8 +382,8 @@ contract ZoneFactoryTest is BaseTest { assertEq(pc.zoneId(), id); assertEq(pc.admin(), p.admin); assertEq(pc.sequencer(), p.sequencer); - assertEq(pc.verifier(), p.verifier); - assertEq(pc.messenger(), zoneFactory.messenger()); + assertEq(pc.verifier(), ZONE_VERIFIER_ADDRESS); + assertEq(pc.messenger(), ZONE_MESSENGER_ADDRESS); assertEq(pc.blockHash(), p.zoneParams.genesisBlockHash); assertEq(pc.genesisTempoBlockNumber(), p.zoneParams.genesisTempoBlockNumber); assertEq(pc.rpcUrl(), p.rpcUrl); @@ -420,7 +391,7 @@ contract ZoneFactoryTest is BaseTest { } function test_messenger_isShared() public { - address messenger = zoneFactory.messenger(); + address messenger = ZONE_MESSENGER_ADDRESS; assertTrue(messenger != address(0)); (, address portal1) = zoneFactory.createZone(_defaultParams()); @@ -462,23 +433,6 @@ contract ZoneFactoryTest is BaseTest { assertEq(zoneFactory.zones(id).admin, admin); // factory: snapshot at creation } - /*////////////////////////////////////////////////////////////// - CREATE-ADDRESS RLP BOUNDARIES - //////////////////////////////////////////////////////////////*/ - - function test_computeCreateAddress_matchesReference_atRlpBoundaries() public { - ZoneFactoryHarness h = new ZoneFactoryHarness(); - uint256[10] memory nonces = - [uint256(0), 1, 0x7f, 0x80, 0xff, 0x100, 0xffff, 0x10000, 0xffffff, 0x1000000]; - for (uint256 i; i < nonces.length; i++) { - assertEq( - h.computeCreateAddress_(address(h), nonces[i]), - vm.computeCreateAddress(address(h), nonces[i]), - "RLP nonce branch mismatch" - ); - } - } - /*////////////////////////////////////////////////////////////// FUZZ //////////////////////////////////////////////////////////////*/ @@ -507,7 +461,7 @@ contract ZoneFactoryTest is BaseTest { assertEq(info.genesisTempoBlockHash, tgh); assertEq(info.genesisTempoBlockNumber, tbn); assertTrue(zoneFactory.isZonePortal(portal)); - assertEq(zoneFactory.zoneCount(), 1); + assertEq(zoneFactory.nextZoneId(), 2); } } @@ -520,12 +474,3 @@ contract NotATIP20 { } } - -/// @notice Harness exposing the internal CREATE-address predictor for boundary testing. -contract ZoneFactoryHarness is ZoneFactory { - - function computeCreateAddress_(address d, uint256 n) external pure returns (address) { - return _computeCreateAddress(d, n); - } - -} diff --git a/specs/ref-impls/test/tempo/ZoneIntegration.t.sol b/specs/ref-impls/test/tempo/ZoneIntegration.t.sol index 14907adaf..1d0fcd8b8 100644 --- a/specs/ref-impls/test/tempo/ZoneIntegration.t.sol +++ b/specs/ref-impls/test/tempo/ZoneIntegration.t.sol @@ -14,6 +14,9 @@ import { PORTAL_CURRENT_DEPOSIT_QUEUE_HASH_SLOT, QueuedDeposit, Withdrawal, + ZONE_FACTORY_ADDRESS, + ZONE_MESSENGER_ADDRESS, + ZONE_VERIFIER_ADDRESS, ZoneInfo, ZoneParams } from "../../src/interfaces/IZone.sol"; @@ -112,19 +115,18 @@ contract ZoneIntegrationTest is BaseTest { // Deploy portal directly (bypass factory TIP20 prefix check), but use a // mock factory registry so the shared messenger can authenticate the source portal. + vm.etch(ZONE_FACTORY_ADDRESS, type(MockZoneFactoryForIntegrationMessenger).runtimeCode); MockZoneFactoryForIntegrationMessenger messengerFactory = - new MockZoneFactoryForIntegrationMessenger(); - ZoneMessenger messengerContract = new ZoneMessenger(address(messengerFactory)); + MockZoneFactoryForIntegrationMessenger(ZONE_FACTORY_ADDRESS); l1Portal = new ZonePortal(); - address verifier = l1Factory.verifier(); vm.prank(_ZONE_FACTORY); l1Portal.initialize( 1, address(l2ZoneToken), - address(messengerContract), + ZONE_MESSENGER_ADDRESS, admin, sequencer, - verifier, + ZONE_VERIFIER_ADDRESS, GENESIS_BLOCK_HASH, genesisTempoBlockNumber, "" diff --git a/specs/ref-impls/test/tempo/ZoneMessenger.t.sol b/specs/ref-impls/test/tempo/ZoneMessenger.t.sol index 0b47f44e9..bccaf5080 100644 --- a/specs/ref-impls/test/tempo/ZoneMessenger.t.sol +++ b/specs/ref-impls/test/tempo/ZoneMessenger.t.sol @@ -4,6 +4,8 @@ pragma solidity ^0.8.13; import { IWithdrawalReceiver, MAX_WITHDRAWAL_CALLBACK_GAS, + ZONE_FACTORY_ADDRESS, + ZONE_MESSENGER_ADDRESS, ZoneInfo } from "../../src/interfaces/IZone.sol"; import { ZoneMessenger } from "../../src/tempo/ZoneMessenger.sol"; @@ -92,11 +94,13 @@ contract ZoneMessengerTest is BaseTest { function setUp() public override { super.setUp(); - messengerFactory = new MockZoneFactoryForMessenger(); + vm.etch(ZONE_FACTORY_ADDRESS, type(MockZoneFactoryForMessenger).runtimeCode); + messengerFactory = MockZoneFactoryForMessenger(ZONE_FACTORY_ADDRESS); messengerFactory.setPortal(ZONE_ID, portal); messengerFactory.setPortal(OTHER_ZONE_ID, otherPortal); - messenger = new ZoneMessenger(address(messengerFactory)); + vm.etch(ZONE_MESSENGER_ADDRESS, type(ZoneMessenger).runtimeCode); + messenger = ZoneMessenger(ZONE_MESSENGER_ADDRESS); zoneToken = new MockZoneToken("Zone USD", "zUSD"); zoneToken.setMinter(address(this), true); } @@ -109,7 +113,7 @@ contract ZoneMessengerTest is BaseTest { ); } - function test_zoneFactoryImmutable() public view { + function test_zoneFactoryConstant() public view { assertEq(address(messenger.zoneFactory()), address(messengerFactory)); } diff --git a/specs/ref-impls/test/tempo/ZonePortal.t.sol b/specs/ref-impls/test/tempo/ZonePortal.t.sol index f99b969b5..cf294adc2 100644 --- a/specs/ref-impls/test/tempo/ZonePortal.t.sol +++ b/specs/ref-impls/test/tempo/ZonePortal.t.sol @@ -26,6 +26,8 @@ import { PORTAL_SEQUENCER_SLOT, Withdrawal, ZONE_FACTORY_ADDRESS, + ZONE_MESSENGER_ADDRESS, + ZONE_VERIFIER_ADDRESS, ZoneInfo, ZoneParams } from "../../src/interfaces/IZone.sol"; @@ -313,7 +315,6 @@ contract ZonePortalTest is BaseTest { initialToken: address(pathUSD), admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, @@ -327,7 +328,7 @@ contract ZonePortalTest is BaseTest { portal = ZonePortal(portalAddr); // Get the shared messenger - messenger = ZoneMessenger(zoneFactory.messenger()); + messenger = ZoneMessenger(ZONE_MESSENGER_ADDRESS); // Set expected messenger for withdrawal receiver withdrawalReceiver.setExpectedMessenger(address(messenger)); @@ -374,7 +375,7 @@ contract ZonePortalTest is BaseTest { assertTrue(portal.isTokenEnabled(address(pathUSD))); assertEq(portal.sequencer(), sequencer); assertEq(portal.admin(), admin); - assertEq(portal.verifier(), zoneFactory.verifier()); + assertEq(portal.verifier(), ZONE_VERIFIER_ADDRESS); assertEq(portal.blockHash(), GENESIS_BLOCK_HASH); assertEq(portal.withdrawalBatchIndex(), 0); assertEq(portal.messenger(), address(messenger)); @@ -383,7 +384,7 @@ contract ZonePortalTest is BaseTest { } function test_zoneFactoryTracksZones() public view { - assertEq(zoneFactory.zoneCount(), 1); + assertEq(zoneFactory.nextZoneId(), 2); assertTrue(zoneFactory.isZonePortal(address(portal))); ZoneInfo memory info = zoneFactory.zones(testZoneId); @@ -963,7 +964,7 @@ contract ZonePortalTest is BaseTest { function test_submitBatch_revertsOnInvalidProof() public { vm.mockCall( - zoneFactory.verifier(), + ZONE_VERIFIER_ADDRESS, abi.encodeWithSelector(IVerifier.verify.selector), abi.encode(false) ); @@ -2455,7 +2456,7 @@ contract ZonePortalTest is BaseTest { function test_metadataGetters() public view { assertEq(portal.zoneId(), testZoneId); assertEq(portal.sequencer(), sequencer); - assertEq(portal.verifier(), zoneFactory.verifier()); + assertEq(portal.verifier(), ZONE_VERIFIER_ADDRESS); assertEq(portal.genesisTempoBlockNumber(), genesisTempoBlockNumber); } diff --git a/specs/ref-impls/test/zone/ZoneConfig.t.sol b/specs/ref-impls/test/zone/ZoneConfig.t.sol index da971bc57..242af556b 100644 --- a/specs/ref-impls/test/zone/ZoneConfig.t.sol +++ b/specs/ref-impls/test/zone/ZoneConfig.t.sol @@ -39,7 +39,6 @@ contract ZoneConfigTest is BaseTest { initialToken: address(pathUSD), admin: admin, sequencer: sequencer, - verifier: zoneFactory.verifier(), zoneParams: ZoneParams({ genesisBlockHash: GENESIS_BLOCK_HASH, genesisTempoBlockHash: GENESIS_TEMPO_BLOCK_HASH, diff --git a/specs/spec.md b/specs/spec.md index 0440fd35f..f47b985e0 100644 --- a/specs/spec.md +++ b/specs/spec.md @@ -654,7 +654,7 @@ For withdrawals with `gasLimit > 0`, the portal uses a revertable self-call that If a legacy or otherwise invalid withdrawal reaches the Tempo queue with `gasLimit > MAX_WITHDRAWAL_GAS_LIMIT`, `processWithdrawal` treats it as a failed callback after dequeueing it and creates a bounce-back deposit. This ensures an over-limit withdrawal cannot permanently block the FIFO queue. -Receiving contracts must implement `IWithdrawalReceiver` and return `onWithdrawalReceived.selector` to confirm successful handling. Receivers authenticate the call by checking `msg.sender == zoneFactory.messenger()` and can use the `sourcePortal` callback argument to identify the originating portal. +Receiving contracts must implement `IWithdrawalReceiver` and return `onWithdrawalReceived.selector` to confirm successful handling. Receivers authenticate the call by checking `msg.sender == ZONE_MESSENGER_ADDRESS` and can use the `sourcePortal` callback argument to identify the originating portal. This enables composable withdrawals where funds flow directly into Tempo contracts (DEX swaps, staking, cross-zone deposits). @@ -1578,16 +1578,22 @@ struct TokenConfig { bool depositsActive; } +address constant ZONE_FACTORY_ADDRESS = 0x5aF2000000000000000000000000000000000000; +bytes12 constant ZONE_PORTAL_PREFIX = 0x5AD000000000000000000000; +address constant ZONE_PORTAL_IMPL_ADDRESS = 0x5AD1000000000000000000000000000000000000; +address constant ZONE_VERIFIER_ADDRESS = 0x5a56000000000000000000000000000000000000; +address constant ZONE_MESSENGER_ADDRESS = 0x5A4d000000000000000000000000000000000000; + struct ZoneInfo { uint32 zoneId; address portal; address initialToken; address admin; address sequencer; - address verifier; bytes32 genesisBlockHash; bytes32 genesisTempoBlockHash; uint64 genesisTempoBlockNumber; + string rpcUrl; } struct ZoneParams { @@ -1610,7 +1616,6 @@ interface IZoneFactory { address initialToken; address admin; address sequencer; - address verifier; ZoneParams zoneParams; string rpcUrl; } @@ -1621,13 +1626,12 @@ interface IZoneFactory { bytes32 genesisBlockHash, bytes32 genesisTempoBlockHash, uint64 genesisTempoBlockNumber ); + function owner() external view returns (address); + function transferOwnership(address newOwner) external; function createZone(CreateZoneParams calldata params) external returns (uint32 zoneId, address portal); - function zoneCount() external view returns (uint32); + function nextZoneId() external view returns (uint32); function zones(uint32 zoneId) external view returns (ZoneInfo memory); function isZonePortal(address portal) external view returns (bool); - function isValidVerifier(address verifier) external view returns (bool); - function verifier() external view returns (address); - function messenger() external view returns (address); } ``` diff --git a/xtask/src/create_zone.rs b/xtask/src/create_zone.rs index 101df33c4..fe9c32f5b 100644 --- a/xtask/src/create_zone.rs +++ b/xtask/src/create_zone.rs @@ -14,6 +14,7 @@ use eyre::{WrapErr as _, eyre}; use std::path::PathBuf; use tempo_alloy::TempoNetwork; use tempo_chainspec::spec::TEMPO_T0_BASE_FEE; +use tempo_zone_contracts::ZONE_MESSENGER_ADDRESS; use zone_primitives::constants::zone_chain_id; use crate::zone_utils::MODERATO_ZONE_FACTORY; @@ -29,7 +30,6 @@ sol! { address initialToken; address admin; address sequencer; - address verifier; ZoneParams zoneParams; string rpcUrl; } @@ -48,8 +48,6 @@ sol! { uint64 genesisTempoBlockNumber ); - function verifier() external view returns (address); - function messenger() external view returns (address); function createZone(CreateZoneParams calldata params) external returns (uint32 zoneId, address portal); } } @@ -118,12 +116,6 @@ impl CreateZone { .await?; let factory = ZoneFactory::new(self.zone_factory, &provider); - println!("Fetching verifier address from ZoneFactory..."); - let verifier = Address::from(factory.verifier().call().await?.0); - println!("Verifier: {verifier}"); - let messenger = Address::from(factory.messenger().call().await?.0); - println!("Messenger: {messenger}"); - // Anchor before createZone so the zone replays the creation block and its // initial TokenEnabled event during L1 backfill. let anchor_block_number = provider.get_block_number().await?; @@ -144,7 +136,6 @@ impl CreateZone { initialToken: self.initial_token, admin: self.admin, sequencer: self.sequencer, - verifier, zoneParams: ZoneParams { genesisBlockHash: B256::ZERO, genesisTempoBlockHash: anchor_hash, @@ -213,7 +204,7 @@ impl CreateZone { "zoneId": zone_id, "chainId": chain_id, "portal": format!("{portal}"), - "messenger": format!("{messenger}"), + "messenger": format!("{ZONE_MESSENGER_ADDRESS}"), "initialToken": format!("{}", self.initial_token), "admin": format!("{}", self.admin), "sequencer": format!("{}", self.sequencer), @@ -232,7 +223,7 @@ impl CreateZone { println!(" Zone ID: {zone_id}"); println!(" Chain ID: {chain_id}"); println!(" Portal: {portal}"); - println!(" Messenger: {messenger}"); + println!(" Messenger: {ZONE_MESSENGER_ADDRESS}"); println!(" Initial Token: {}", self.initial_token); println!(" Admin: {}", self.admin); println!(" Sequencer: {}", self.sequencer); diff --git a/xtask/src/zone_info.rs b/xtask/src/zone_info.rs index 4b0d5660f..0f249f5d8 100644 --- a/xtask/src/zone_info.rs +++ b/xtask/src/zone_info.rs @@ -1,7 +1,9 @@ use alloy::{primitives::Address, providers::ProviderBuilder}; use eyre::eyre; use tempo_alloy::TempoNetwork; -use tempo_zone_contracts::{ZoneFactory, ZonePortal}; +use tempo_zone_contracts::{ + ZONE_MESSENGER_ADDRESS, ZONE_VERIFIER_ADDRESS, ZoneFactory, ZonePortal, +}; use crate::zone_utils::MODERATO_ZONE_FACTORY; @@ -30,10 +32,10 @@ impl ZoneInfoCmd { let zone_id = if self.identifier.starts_with("0x") { // Look up by portal address — scan all zones let portal: Address = self.identifier.parse()?; - let count = factory.zoneCount().call().await?; + let next_zone_id = factory.nextZoneId().call().await?; let mut found = None; - for id in 1..=count { + for id in 1..next_zone_id { let info = factory.zones(id).call().await?; if info.portal == portal { found = Some(id); @@ -51,14 +53,12 @@ impl ZoneInfoCmd { if info.portal == Address::ZERO { return Err(eyre!("zone {zone_id} does not exist")); } - let messenger = factory.messenger().call().await?; - println!("Zone {}", info.zoneId); println!(" Portal: {}", info.portal); - println!(" Messenger: {messenger}"); + println!(" Messenger: {ZONE_MESSENGER_ADDRESS}"); println!(" Initial Token: {}", info.initialToken); println!(" Sequencer: {}", info.sequencer); - println!(" Verifier: {}", info.verifier); + println!(" Verifier: {ZONE_VERIFIER_ADDRESS}"); println!(" Genesis Block Hash: {}", info.genesisBlockHash); println!(" Genesis Tempo Hash: {}", info.genesisTempoBlockHash); println!(" Genesis Tempo Block: {}", info.genesisTempoBlockNumber); diff --git a/xtask/src/zone_utils.rs b/xtask/src/zone_utils.rs index 94b52f5f2..59cecb254 100644 --- a/xtask/src/zone_utils.rs +++ b/xtask/src/zone_utils.rs @@ -13,7 +13,7 @@ use std::{ }; use tempo_alloy::TempoNetwork; use tempo_contracts::precompiles::ITIP20 as TIP20Token; -use tempo_zone_contracts::{ZoneInbox, ZonePortal}; +use tempo_zone_contracts::{ZONE_FACTORY_ADDRESS, ZoneInbox, ZonePortal}; pub(crate) const L1_EXPLORER: &str = "https://explore.moderato.tempo.xyz/tx"; /// Shared Moderato ZoneFactory. @@ -21,9 +21,8 @@ pub(crate) const L1_EXPLORER: &str = "https://explore.moderato.tempo.xyz/tx"; /// `create-zone`, `deploy-router`, and `zone-info` use this as their default /// factory unless the caller overrides `--zone-factory` or `ZONE_FACTORY`, or /// `zone.json` already provides a zone-specific value. -/// Explorer: https://explore.moderato.tempo.xyz/address/0xd97052545B978cc79Dd083912C72CA62f889dFaF -pub(crate) const MODERATO_ZONE_FACTORY: Address = - address!("0xd97052545B978cc79Dd083912C72CA62f889dFaF"); +/// Explorer: https://explore.moderato.tempo.xyz/address/0x5aF2000000000000000000000000000000000000 +pub(crate) const MODERATO_ZONE_FACTORY: Address = ZONE_FACTORY_ADDRESS; pub(crate) const STABLECOIN_DEX_ADDRESS: Address = address!("0xDEc0000000000000000000000000000000000000"); pub(crate) const ROUTER_CALLBACK_GAS_LIMIT: u64 = 2_000_000;