From fae9e43cd30c218424f3a57b0406060fec9d25c9 Mon Sep 17 00:00:00 2001 From: Nilesh Gupta Date: Tue, 12 May 2026 12:18:16 +0530 Subject: [PATCH] feat: added changes in core validator as per contract audit changes --- test/utils/bytecode.go | 2 +- x/uexecutor/keeper/evm.go | 43 ----------- x/uexecutor/keeper/gas_fee.go | 14 ++-- x/uexecutor/keeper/gas_fee_test.go | 82 +++++++++++++++++++++ x/uexecutor/types/abi.go | 13 +--- x/uregistry/keeper/genesis_internal_test.go | 14 ++-- x/uregistry/types/constants_test.go | 10 +-- 7 files changed, 105 insertions(+), 73 deletions(-) create mode 100644 x/uexecutor/keeper/gas_fee_test.go diff --git a/test/utils/bytecode.go b/test/utils/bytecode.go index 74700feaf..3c054680e 100644 --- a/test/utils/bytecode.go +++ b/test/utils/bytecode.go @@ -6,7 +6,7 @@ const UEA_SVM_BYTECODE = "6080604052600436101561001a575b3615610018575f80fd5b005b const UEA_PROXY_BYTECODE = "608060405260043610610028575f3560e01c806323efa7ec14610032578063aaf10f4214610051575b6100306100a8565b005b34801561003d575f80fd5b5061003061004c366004610368565b6100ba565b34801561005c575f80fd5b507f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5460405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100b86100b36102cc565b61034a565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f811580156101045750825b90505f8267ffffffffffffffff1660011480156101205750303b155b90508115801561012e575080155b15610165576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156101c65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f6101ef7f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5490565b905073ffffffffffffffffffffffffffffffffffffffff81161561023f576040517fae962d4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d555083156102c45784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f806102f67f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610345576040517fae962d4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b365f80375f80365f845af43d5f803e808015610364573d5ff35b3d5ffd5b5f60208284031215610378575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461039b575f80fd5b939250505056fea2646970667358221220c4b8f9457567bdcd08b95faef7df86de4e9daead65e2db22018126d9eb77d85864736f6c634300081a0033" -const HANDLER_CONTRACT_BYTECODE = "608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c908162bc574b1461393a5750806301ffc9a7146138995780630379eae8146138395780630ac6eb771461378d578063172bfc1c146137115780631a4e49d4146136e85780631a873ce4146136b5578063240028e81461366b578063248a9ca3146136195780632f2ff15d146135bc57806336568abe146135525780633f4ba83a146134495780634b1d2eeb146134095780634d20d0f8146133d65780634d49fbf3146132565780634eb7d1a11461321657806357724c41146131155780635b549182146130e25780635c975abb146130a1578063606b05a4146130345780636435967b1461286757806364f10e501461284c57806368c70c9e146128015780636ca752e3146127b65780636d4008a814612771578063780ad8271461206757806378a8812714611fec57806381fbadad14611fce5780638377e23014611f9a57806383b94a5214611ee45780638456cb5914611db957806391d1485414611d425780639be7fdb214611c57578063a217fddf14611c3b578063a5172ddb14611bf0578063a861469f14611ba6578063ad14d38514611b5c578063af90f35114611a7e578063b49f6b8814611a0f578063b5d8349f146119ae578063b6322a9f14611963578063be0580c0146117bd578063c6f1b7e71461176c578063cd20c6e814611727578063d17c872c14611601578063d547741f1461159a578063db9a0daf146114d7578063dbc1b46414611476578063dcc16b5c14611238578063dd19e7551461104c578063e798646614610f6d578063ec87621c14610f32578063eefbaa3514610e44578063f881446714610646578063f8c8765e14610314578063fb46e99d146102f65763fc6b5de80361000f57346102f35760206003193601126102f3576004359067ffffffffffffffff82116102f35760206102e0816102cd3660048701613a2f565b8160405193828580945193849201613b1f565b8101601281520301902054604051908152f35b80fd5b50346102f357806003193601126102f3576020600654604051908152f35b50346102f35760806003193601126102f35761032e613aa7565b610336613aca565b61033e613aed565b6064359173ffffffffffffffffffffffffffffffffffffffff8316809303610642577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549360ff8560401c16159467ffffffffffffffff81168015908161063a575b6001149081610630575b159081610627575b506105ff579173ffffffffffffffffffffffffffffffffffffffff80949392838860017fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000859716177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556105aa575b5061042a6143a1565b6104326143a1565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561045e6143a1565b61046733613ef5565b50167fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a55167fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff000000000000000000000000000000000000000060085416176008557fffffffffffffffffffffffff000000000000000000000000000000000000000060095416176009556105165780f35b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f610421565b6004877ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f6103b2565b303b1591506103aa565b8791506103a0565b8480fd5b5060a06003193601126102f35761065b613aa7565b90610664613bc5565b9160443591606435936084359273ffffffffffffffffffffffffffffffffffffffff8416928385036102f35773ffffffffffffffffffffffffffffffffffffffff601054163303610e1c576106b76141f6565b6106bf614249565b8691839773ffffffffffffffffffffffffffffffffffffffff8216948515610df4578615610df4573415610dcc578815610dcc5762ffffff1615610d8a575b15610d62575b824211610d3a576107bf60208973ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a54169488861090815f14610d335786915b15610d2b57905b604051958694859384937f1698ee820000000000000000000000000000000000000000000000000000000085526004850191604091949373ffffffffffffffffffffffffffffffffffffffff62ffffff9281606087019816865216602085015216910152565b03915afa908115610bcc579073ffffffffffffffffffffffffffffffffffffffff918491610cfc575b501615610cd457803b15610bc85781600491604051928380927fd0e30db000000000000000000000000000000000000000000000000000000000825234905af18015610c3557908291610cbf575b50600a546008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015234602482015292602092849260449284929091165af18015610c3557610ca2575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a541697604051986108cd8a61396a565b89528460208a0152169182604089015230606089015260808801528560a08801523460c08801528060e088015260206109b961010473ffffffffffffffffffffffffffffffffffffffff6008541699846040519b8c9485937fdb3e2198000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af1968715610c95578197610c5d575b5080602073ffffffffffffffffffffffffffffffffffffffff600a5416604473ffffffffffffffffffffffffffffffffffffffff6008541660405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401528160248401525af18015610c3557610c40575b506040517f42966c6800000000000000000000000000000000000000000000000000000000815286600482015260208160248185885af18015610c3557610c08575b5086340394348611610bdb57873403610b03575b505060606040967f01fd625a5ce1109c10761818e2ef64ea92cd4966d78086d37e5a4b50e322687892885191825287602083015288820152a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b73ffffffffffffffffffffffffffffffffffffffff600a5416803b15610bd7578280916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528c60048401525af18015610bcc579183918893610bae575b5081809381925af1610b7a613db8565b5015610b865780610a9a565b807f90b8ec180000000000000000000000000000000000000000000000000000000060049252fd5b610bbb91935082906139b4565b610bc8578186915f610b6a565b5080fd5b6040513d85823e3d90fd5b8280fd5b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b610c299060203d602011610c2e575b610c2181836139b4565b810190613cb9565b610a86565b503d610c17565b6040513d84823e3d90fd5b610c589060203d602011610c2e57610c2181836139b4565b610a44565b9096506020813d602011610c8d575b81610c79602093836139b4565b81010312610c895751955f6109c9565b5f80fd5b3d9150610c6c565b50604051903d90823e3d90fd5b610cba9060203d602011610c2e57610c2181836139b4565b6108a1565b81610cc9916139b4565b6102f357805f610836565b6004827f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b610d1e915060203d602011610d24575b610d1681836139b4565b810190613d7f565b5f6107e8565b503d610d0c565b508590610759565b8091610752565b6004827f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9150600654603c810290808204603c1490151715610bdb57610d849042613dab565b91610704565b8483526004602052604083205462ffffff169850886106fe575b6004837f3733548a000000000000000000000000000000000000000000000000000000008152fd5b6004847f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004847fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b807fbce361b00000000000000000000000000000000000000000000000000000000060049252fd5b50346102f35760606003193601126102f35760043567ffffffffffffffff8111610bc857610f1b610e9a7f5e41bf0052b493123a63e4e0d9095ed4324108e489d58c9a0948b2be366ac8c6923690600401613a2f565b602435604435610ef66040518385519160208181890194610ebc818388613b1f565b8101600b81520301902055826040516020818851610edb818388613b1f565b81016011815203019020556040519182918651928391613b1f565b8101906012825260208142930301902055604051938493608085526080850190613b40565b91602084015260408301524260608301520390a180f35b50346102f357806003193601126102f35760206040517f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b088152f35b50346102f35760406003193601126102f357610f87613aa7565b73ffffffffffffffffffffffffffffffffffffffff610fa4613b10565b91610fad613de7565b169081156110245760207f16ef4de07b0452a43221c91064fb645963a8e2e60bd8a7514da58d56e315c42291838552600f825261101881604087209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6040519015158152a280f35b6004837fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102f35760406003193601126102f357611066613aa7565b73ffffffffffffffffffffffffffffffffffffffff6024359116906040517fa0c50b690000000000000000000000000000000000000000000000000000000081528381600481865afa90811561122d57849161120b575b5060405191815192602081818501956110d7818389613b1f565b81016014815203019020549080155f146111cd57505b73ffffffffffffffffffffffffffffffffffffffff604051602081855161111581838a613b1f565b8101600c81520301902054169283156111a557602061113f91604051809381928751928391613b1f565b8101600b8152030190205490811561117d5761117993949561116360409284613ca6565b9681526013602052205460405195869586613b83565b0390f35b6004867fe661aed0000000000000000000000000000000000000000000000000000000008152fd5b6004867fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b908082106111db57506110ed565b85906044927fff632bea000000000000000000000000000000000000000000000000000000008352600452602452fd5b61122791503d8086833e61121f81836139b4565b810190613c47565b5f6110bd565b6040513d86823e3d90fd5b50346102f35760606003193601126102f35760043567ffffffffffffffff8111610bc85761126a903690600401613a2f565b611272613aca565b60443562ffffff8116918282036106425761128b613de7565b73ffffffffffffffffffffffffffffffffffffffff811680156111a5579160209161135d9373ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541691821091825f1461146f5780925b1561146757506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa801561122d5773ffffffffffffffffffffffffffffffffffffffff918591611448575b5016908115611420579161140f917f21e3c1439de176cb39006e603b26a8d890fe2267c804597e40d2954871141d7d9360405160208185516113c98183858a01613b1f565b8101600d815203019020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051938493606085526060850190613b40565b91602084015260408301520390a180f35b6004847f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b611461915060203d602011610d2457610d1681836139b4565b5f611384565b905090610759565b81926112f1565b50346102f35760206003193601126102f3576004359067ffffffffffffffff82116102f357602073ffffffffffffffffffffffffffffffffffffffff6114c3826102cd3660048801613a2f565b8101600c8152030190205416604051908152f35b50346102f35760206003193601126102f3576004358180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611572576020817f424b07caa75ce8e1c3985f334273f957db9ce138de114e48e50d8240d4d7300b92600655604051908152a180f35b6004827f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102f35760406003193601126102f3576115fd6004356115ba613aca565b906115f86115f3825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b613e6f565b6140ee565b5080f35b50346102f35760406003193601126102f35761161b613aa7565b611623613bc5565b908280527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040832073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156116ff5773ffffffffffffffffffffffffffffffffffffffff169081156110245762ffffff16906101f4821415806116f3575b806116e7575b610da4578252600460205260408220907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000082541617905580f35b506127108214156116ad565b50610bb88214156116a7565b6004837f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102f35760206003193601126102f357604060209173ffffffffffffffffffffffffffffffffffffffff61175b613aa7565b168152601383522054604051908152f35b50346102f357806003193601126102f357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102f35760606003193601126102f3576117d7613aa7565b6117df613aca565b6117e7613aed565b918380527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040842073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561193b5773ffffffffffffffffffffffffffffffffffffffff168015801561191d575b80156118ff575b610df45773ffffffffffffffffffffffffffffffffffffffff929183917fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff00000000000000000000000000000000000000006008541617600855167fffffffffffffffffffffffff0000000000000000000000000000000000000000600954161760095580f35b5073ffffffffffffffffffffffffffffffffffffffff831615611862565b5073ffffffffffffffffffffffffffffffffffffffff82161561185b565b6004847f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b50346102f35760206003193601126102f3576004359067ffffffffffffffff82116102f357602061199b816102cd3660048701613a2f565b8101601581520301902054604051908152f35b50346102f35760206003193601126102f3576004359067ffffffffffffffff82116102f357602073ffffffffffffffffffffffffffffffffffffffff6119fb826102cd3660048801613a2f565b8101600d8152030190205416604051908152f35b50346102f3577f57ad858a99d9aee6f1fd395e454bb1659eb8500ccb081c729a103dc2247ba3a4611a3f36613a75565b90611a48613de7565b816040516020818451611a5e8183858901613b1f565b8101601581520301902055611a7860405192839283613c2b565b0390a180f35b50346102f35760206003193601126102f357611a98613aa7565b8180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156115725773ffffffffffffffffffffffffffffffffffffffff168015611b34577fffffffffffffffffffffffff0000000000000000000000000000000000000000601054161760105580f35b6004827fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102f35760206003193601126102f35760ff604060209273ffffffffffffffffffffffffffffffffffffffff611b92613aa7565b168152600384522054166040519015158152f35b50346102f35760206003193601126102f35762ffffff604060209273ffffffffffffffffffffffffffffffffffffffff611bde613aa7565b16815260048452205416604051908152f35b50346102f35760206003193601126102f3576004359067ffffffffffffffff82116102f3576020611c28816102cd3660048701613a2f565b8101600b81520301902054604051908152f35b50346102f357806003193601126102f357602090604051908152f35b50346102f35760406003193601126102f35760043567ffffffffffffffff8111610bc857611c89903690600401613a2f565b73ffffffffffffffffffffffffffffffffffffffff611ca6613aca565b611cae613de7565b168015611024577f0c7d242571a289736ea536c54ebe236d31ba62abfd4f22b8d54d2988dc0dd94991611d36916040516020818451611cf08183858901613b1f565b8101600c815203019020817fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051928392604084526040840190613b40565b9060208301520390a180f35b50346102f35760406003193601126102f35773ffffffffffffffffffffffffffffffffffffffff6040611d73613aca565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020522091165f52602052602060ff60405f2054166040519015158152f35b50346102f357806003193601126102f3578080527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040812073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611ebc57611e266141f6565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b807f49e27cff0000000000000000000000000000000000000000000000000000000060049252fd5b50346102f35760206003193601126102f357611efe613aa7565b8180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156115725773ffffffffffffffffffffffffffffffffffffffff168015611b34577fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a5580f35b50346102f357806003193601126102f357602073ffffffffffffffffffffffffffffffffffffffff60105416604051908152f35b50346102f357806003193601126102f3576020600e54604051908152f35b50346102f357611ffb36613bd7565b9083809394527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040832073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156116ff57612064929361205f6141f6565b613cd1565b80f35b50346102f35760c06003193601126102f357612081613aa7565b6024359061208d613aed565b906064359262ffffff8416908185036125485760843560a435936120af6141f6565b6120b7614249565b6120c28684836142c0565b8473ffffffffffffffffffffffffffffffffffffffff821697888a52600360205260ff60408b20541615612749579415612708575b156126b3575b84421161268b576020846121ba928a73ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541690818d10805f146126845781935b501561146757506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156125ed5773ffffffffffffffffffffffffffffffffffffffff918991612665575b50161561263d578015612615576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018390526020816044818b8b5af180156125ed576125f8575b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018390526020816044818b8b5af180156125ed576125d0575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a541693604051946122c58661396a565b8886526020808701918252929091166040808701828152306060890190815260808901998a5260a0890188815260c08a0188815260e08b018f815260085495517f414bf3890000000000000000000000000000000000000000000000000000000081529b5173ffffffffffffffffffffffffffffffffffffffff90811660048e01529751881660248d0152935162ffffff1660448c01529151861660648b0152995160848a0152985160a4890152975160c48801529651821660e48701529585916101049183918c91165af192831561256957879361259c575b5082106125745773ffffffffffffffffffffffffffffffffffffffff60085416604051907f095ea7b300000000000000000000000000000000000000000000000000000000825260048201528660248201526020816044818a8a5af180156125695761254c575b508573ffffffffffffffffffffffffffffffffffffffff600a5416803b15610bc8578180916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528960048401525af18015610c3557612533575b5080808085885af161247a613db8565b501561250b57927ff5d6ca9b390b5271e0cbb3d43b4d708d5b17804cb81a4c65e027226d87ccf0e2949273ffffffffffffffffffffffffffffffffffffffff9260c09584600a54169060405196875260208701526040860152606085015260808401521660a0820152a160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6004867f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b8161253d916139b4565b61254857855f61246a565b8580fd5b6125649060203d602011610c2e57610c2181836139b4565b612406565b6040513d89823e3d90fd5b6004867f8199f5f3000000000000000000000000000000000000000000000000000000008152fd5b9092506020813d6020116125c8575b816125b8602093836139b4565b81010312610c895751915f61239f565b3d91506125ab565b6125e89060203d602011610c2e57610c2181836139b4565b612299565b6040513d8a823e3d90fd5b6126109060203d602011610c2e57610c2181836139b4565b612236565b6004877f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004877f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b61267e915060203d602011610d2457610d1681836139b4565b5f6121e1565b829361214d565b6004887f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9350600654603c810290808204603c14901517156126db576126d59042613dab565b936120fd565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8789526004602052604089205462ffffff169450846120f7576004897f3733548a000000000000000000000000000000000000000000000000000000008152fd5b60048a7f4e38f95a000000000000000000000000000000000000000000000000000000008152fd5b50346102f35760206003193601126102f357604060209173ffffffffffffffffffffffffffffffffffffffff6127a5613aa7565b168152600583522054604051908152f35b50346102f35760206003193601126102f3576004359067ffffffffffffffff82116102f35760206127ee816102cd3660048701613a2f565b8101601481520301902054604051908152f35b50346102f35760206003193601126102f3576004359067ffffffffffffffff82116102f3576020612839816102cd3660048701613a2f565b8101601181520301902054604051908152f35b50346102f35761206461285e36613bd7565b9161205f6141f6565b5034610c895760c0600319360112610c8957612881613aa7565b60243561288c613aed565b6064358015918215809203610c895760843562ffffff811690818103610c895760a4356128b76141f6565b6128bf614249565b6128ca84888a6142c0565b5f95156129e95750506040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101869052919050602082806044810103818a73ffffffffffffffffffffffffffffffffffffffff8b165af1908115612569577ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e49460609473ffffffffffffffffffffffffffffffffffffffff9485946129ca575b505b6040519788526020880152604087015216941692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6129e29060203d602011610c2e57610c2181836139b4565b505f61298c565b8091929395501561300c5773ffffffffffffffffffffffffffffffffffffffff871691825f52600360205260ff60405f20541615612fe4579215612fa2575b600654603c810290808204603c1490151715612f7557612a489042613dab565b804211612f4d57612b0060208573ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a541680881090815f14612f46578d915b15612f3e576040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa8015612e395773ffffffffffffffffffffffffffffffffffffffff915f91612f1f575b501615612ef7576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018890526020816044815f885af18015612e3957612eda575b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018890526020816044815f885af18015612e3957612ebd575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a54169460405195612c058761396a565b858752602087015216604085015230606085015260808401528560a08401528060c08401525f60e08401526020612cef61010473ffffffffffffffffffffffffffffffffffffffff60085416955f60405197889485937f414bf389000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af1928315612e39575f93612e89575b508210612e615760205f91604473ffffffffffffffffffffffffffffffffffffffff6008541660405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401528160248401525af18015612e3957612e44575b5073ffffffffffffffffffffffffffffffffffffffff600a5416803b15610c89575f80916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528760048401525af18015612e3957612e24575b508580808084875af1612ddc613db8565b501561250b5773ffffffffffffffffffffffffffffffffffffffff7ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e49360609382939061298e565b612e319196505f906139b4565b5f945f612dcb565b6040513d5f823e3d90fd5b612e5c9060203d602011610c2e57610c2181836139b4565b612d68565b7f8199f5f3000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d602011612eb5575b81612ea5602093836139b4565b81010312610c895751915f612cff565b3d9150612e98565b612ed59060203d602011610c2e57610c2181836139b4565b612bd9565b612ef29060203d602011610c2e57610c2181836139b4565b612b76565b7f76ecffc0000000000000000000000000000000000000000000000000000000005f5260045ffd5b612f38915060203d602011610d2457610d1681836139b4565b5f612b27565b508c90610759565b8091612a95565b7f1ab7da6b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9150805f52600460205262ffffff60405f2054169182612a28577f3733548a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e38f95a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f22c50cbf000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610c89577f882f47825d4043cd04a564cad4f524a7fe00a604ae024c23dbc8065b77668b4761306336613a75565b9061306c613de7565b8160405160208184516130828183858901613b1f565b810160148152030190205561309c60405192839283613c2b565b0390a1005b34610c89575f600319360112610c8957602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b34610c89575f600319360112610c8957602073ffffffffffffffffffffffffffffffffffffffff60075416604051908152f35b34610c89576040600319360112610c895761312e613aa7565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040902054602435919060ff16156131ee5773ffffffffffffffffffffffffffffffffffffffff1680156131c657611388821161319e575f52600560205260405f20555f80f35b7fc31c0b6e000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fd92e233d000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f49e27cff000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610c89576020600319360112610c89576004355f526002602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610c89576020600319360112610c895760045f73ffffffffffffffffffffffffffffffffffffffff613287613aa7565b16604051928380927fa0c50b690000000000000000000000000000000000000000000000000000000082525afa908115612e39575f916133bc575b50604051815190602081818501936132db818387613b1f565b81016015815203019020549182156133945773ffffffffffffffffffffffffffffffffffffffff6040516020818451613315818389613b1f565b8101600c81520301902054169182156131c657602061333f91604051809381928651928391613b1f565b8101600b8152030190205490811561336c578161335f8561117994613ca6565b9460405195869586613b83565b7fe661aed0000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f9502a873000000000000000000000000000000000000000000000000000000005f5260045ffd5b6133d091503d805f833e61121f81836139b4565b816132c2565b34610c89575f600319360112610c8957602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b34610c89576020600319360112610c89576004355f526001602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610c89575f600319360112610c8957335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156131ee577fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff81161561352a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b7f8dfc202b000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610c89576040600319360112610c895761356b613aca565b3373ffffffffffffffffffffffffffffffffffffffff8216036135945761001a906004356140ee565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610c89576040600319360112610c895761001a6004356135db613aca565b906136146115f3825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b613fdc565b34610c89576020600319360112610c895760206136636004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b604051908152f35b34610c89576020600319360112610c895773ffffffffffffffffffffffffffffffffffffffff613699613aa7565b165f52600f602052602060ff60405f2054166040519015158152f35b34610c89575f600319360112610c8957602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b34610c89576020600319360112610c89576004355f525f602052602060405f2054604051908152f35b34610c89576040600319360112610c895761372a613aa7565b73ffffffffffffffffffffffffffffffffffffffff6024359161374b613de7565b169081156131c65760207f911a025fb070fa2a29c37a3bf4c00d16acf15583cd050f17bdbacbab7e72320391835f52601382528060405f2055604051908152a2005b34610c89576040600319360112610c89576137a6613aa7565b6137ae613b10565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156131ee5773ffffffffffffffffffffffffffffffffffffffff61001a92165f52600360205260405f209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b34610c89577f6a59d469e3757d6e139cdf95b12740f585d553afac49b90bdbe278502a44271861386836613a75565b9081604051602081845161387f8183858901613b1f565b8101600b8152030190205561309c60405192839283613c2b565b34610c89576020600319360112610c89576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610c8957807f7965db0b0000000000000000000000000000000000000000000000000000000060209214908115613910575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501482613905565b34610c89575f600319360112610c895760209073ffffffffffffffffffffffffffffffffffffffff600854168152f35b610100810190811067ffffffffffffffff82111761398757604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761398757604052565b67ffffffffffffffff811161398757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610c8957803590613a46826139f5565b92613a5460405194856139b4565b82845260208383010111610c8957815f926020809301838601378301015290565b6040600319820112610c89576004359067ffffffffffffffff8211610c8957613aa091600401613a2f565b9060243590565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610c8957565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610c8957565b6044359073ffffffffffffffffffffffffffffffffffffffff82168203610c8957565b602435908115158203610c8957565b5f5b838110613b305750505f910152565b8181015183820152602001613b21565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613b7c81518092818752878088019101613b1f565b0116010190565b919260a09373ffffffffffffffffffffffffffffffffffffffff613bc29796931684526020840152604083015260608201528160808201520190613b40565b90565b6024359062ffffff82168203610c8957565b6003196060910112610c895760043573ffffffffffffffffffffffffffffffffffffffff81168103610c8957906024359060443573ffffffffffffffffffffffffffffffffffffffff81168103610c895790565b929190613c42602091604086526040860190613b40565b930152565b602081830312610c895780519067ffffffffffffffff8211610c89570181601f82011215610c89578051613c7a816139f5565b92613c8860405194856139b4565b81845260208284010111610c8957613bc29160208085019101613b1f565b81810292918115918404141715612f7557565b90816020910312610c8957518015158103610c895790565b90602091613d5293613ce48184846142c0565b5f73ffffffffffffffffffffffffffffffffffffffff6040518097819682957f47e7ef24000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0393165af18015612e3957613d645750565b613d7c9060203d602011610c2e57610c2181836139b4565b50565b90816020910312610c89575173ffffffffffffffffffffffffffffffffffffffff81168103610c895790565b91908201809211612f7557565b3d15613de2573d90613dc9826139f5565b91613dd760405193846139b4565b82523d5f602084013e565b606090565b335f9081527f06484cc59dc38e4f67c31122333a17ca81b3ca18cdf02bfc298072fa52b0316a602052604090205460ff1615613e1f57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0860245260445ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615613ec65750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16613fd75773ffffffffffffffffffffffffffffffffffffffff165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f146140e857805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f146140e857805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300541661422157565b7fd93c0665000000000000000000000000000000000000000000000000000000005f5260045ffd5b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054146142985760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b90919073ffffffffffffffffffffffffffffffffffffffff16156131c65773ffffffffffffffffffffffffffffffffffffffff1680156131c65773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168114908115614397575b5061436f571561434757565b7f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f82d5d76a000000000000000000000000000000000000000000000000000000005f5260045ffd5b905030145f61433b565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156143d057565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffdfea2646970667358221220768f174ca9357d5558e1f156d7a974035ebdf7b2ddf7fb9cc7e899aba472f96d64736f6c634300081a0033" +const HANDLER_CONTRACT_BYTECODE = "608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c908162bc574b14614b895750806301ffc9a714614ab5578063022d63fb14614a98578063049bf04c146149955780630615f0a2146149355780630840ba721461445e57806308af7f86146143fe5780630aa6220b146142bc5780631a4e49d4146142935780631a873ce4146142605780631c90064a14614200578063248a9ca3146141ae57806325c36c751461416a5780632f2ff15d146140df57806336568abe14613ef65780633f4ba83a14613e1b5780634243fbaa14613dd1578063447146a214613d875780634b1d2eeb14613d475780634d20d0f814613d145780634d49fbf314613b105780634eb7d1a114613ad05780634f882f3314613a6b57806355b487f1146139f9578063580fc6a9146138cc5780635b549182146138995780635c975abb14613858578063634e93da146136c35780636435967b14612eec578063649a5ec714612bc257806364f10e5014612b7857806368c70c9e14612b2d5780636ca752e314612ae25780636f419e31146129fd5780637574d9a0146129e0578063780ad8271461235d57806378a881271461233a578063801bee15146120d157806381fbadad146120b35780638377e2301461207f5780638456cb5914611f0c5780638468c05b14611ea557806384ef8ffc14611d6e57806387525a3714611d735780638da5cb5b14611d6e5780638f247b8c14611cc85780638f40e8f514611cab57806391d1485414611c34578063a1eda53c14611bae578063a217fddf14611b92578063a5172ddb14611b47578063a861469f14611afd578063ad14d38514611ab3578063b5d8349f14611a52578063b6322a9f14611a07578063b6aa5ce3146119eb578063bb88f3d9146119a0578063bfc7a3e4146118d2578063c6b54b3c14611897578063c6f1b7e714611846578063cc8463c81461181b578063cd20c6e8146117d6578063cefc14291461161f578063cf6eefb714611593578063d29c5c1c14611558578063d547741f146114c1578063d602b9fd14611426578063dbc1b464146113c5578063dd19e755146111af578063e229cd7614611192578063e63ab1e914611157578063ec87621c1461111c578063eefbaa3514610ffd578063f5b541a614610fc2578063f6b9ec7c14610fa5578063f881446714610820578063f8c8765e146104b8578063fb46e99d1461049a578063fc6b5de81461043c5763fcb6c2300361000f5734610439576040600319360112610439576103ac614cf6565b6024359081151580920361043557602073ffffffffffffffffffffffffffffffffffffffff7f42cc79f957a9535dc49c660eec62747fb540bef0dd29cd7f6c0a810816af4cff92169283855260038252604085207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a280f35b8280fd5b80fd5b5034610439576020600319360112610439576004359067ffffffffffffffff8211610439576020610487816104743660048701614c7e565b8160405193828580945193849201614d5f565b8101601281520301902054604051908152f35b50346104395780600319360112610439576020600654604051908152f35b5034610439576080600319360112610439576104d2614cf6565b6104da614d19565b6104e2614d3c565b6064359173ffffffffffffffffffffffffffffffffffffffff831680930361081c577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549367ffffffffffffffff60ff8660401c1615951680159081610814575b600114908161080a575b159081610801575b506107d95773ffffffffffffffffffffffffffffffffffffffff92918380928760017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055610763575b6105eb615874565b6105f3615874565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556106203361505c565b50167fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a55167fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff000000000000000000000000000000000000000060085416176008557fffffffffffffffffffffffff000000000000000000000000000000000000000060095416176009556106cf5780f35b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556105e3565b6004867ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f610555565b303b15915061054d565b869150610543565b8480fd5b5060a060031936011261043957610835614cf6565b9061083e614dc3565b9160443591606435936084359273ffffffffffffffffffffffffffffffffffffffff8416928385036104395773ffffffffffffffffffffffffffffffffffffffff601054163303610f7d576108916154d7565b61089961552a565b8691839773ffffffffffffffffffffffffffffffffffffffff8216948515610f55578615610f55573415610f2d578815610f2d5762ffffff1615610eeb575b15610ec3575b824211610e9b5761099960208973ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a54169488861090815f14610e945786915b15610e8c57905b604051958694859384937f1698ee820000000000000000000000000000000000000000000000000000000085526004850191604091949373ffffffffffffffffffffffffffffffffffffffff62ffffff9281606087019816865216602085015216910152565b03915afa908115610d41579073ffffffffffffffffffffffffffffffffffffffff918491610e5d575b501615610e3557803b15610d3d5781600491604051928380927fd0e30db000000000000000000000000000000000000000000000000000000000825234905af18015610dd057908291610e20575b5050610a4f73ffffffffffffffffffffffffffffffffffffffff600a5416349073ffffffffffffffffffffffffffffffffffffffff6008541690615760565b62ffffff73ffffffffffffffffffffffffffffffffffffffff600a54169760405198610a7a8a614bb9565b89528460208a0152169182604089015230606089015260808801528560a08801523460c08801528060e08801526020610b6661010473ffffffffffffffffffffffffffffffffffffffff6008541699846040519b8c9485937fdb3e2198000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af1968715610e13578197610ddb575b50610bb273ffffffffffffffffffffffffffffffffffffffff600a541673ffffffffffffffffffffffffffffffffffffffff600854169061565a565b6040517f42966c6800000000000000000000000000000000000000000000000000000000815286600482015260208160248185885af1908115610dd0578291610da1575b5015610d795786340394348611610d4c57873403610c78575b505060606040967f01fd625a5ce1109c10761818e2ef64ea92cd4966d78086d37e5a4b50e322687892885191825287602083015288820152a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b73ffffffffffffffffffffffffffffffffffffffff600a5416803b15610435578280916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528c60048401525af18015610d41579183918893610d23575b5081809381925af1610cef614e7b565b5015610cfb5780610c0f565b807f90b8ec180000000000000000000000000000000000000000000000000000000060049252fd5b610d309193508290614c03565b610d3d578186915f610cdf565b5080fd5b6040513d85823e3d90fd5b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b807f66b2a6fe0000000000000000000000000000000000000000000000000000000060049252fd5b610dc3915060203d602011610dc9575b610dbb8183614c03565b810190614ed9565b5f610bf6565b503d610db1565b6040513d84823e3d90fd5b9096506020813d602011610e0b575b81610df760209383614c03565b81010312610e075751955f610b76565b5f80fd5b3d9150610dea565b50604051903d90823e3d90fd5b81610e2a91614c03565b61043957805f610a10565b6004827f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b610e7f915060203d602011610e85575b610e778183614c03565b810190614fac565b5f6109c2565b503d610e6d565b508590610933565b809161092c565b6004827f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9150600654603c810290808204603c1490151715610d4c57610ee5904261504f565b916108de565b8483526004602052604083205462ffffff169850886108d8575b6004837f3733548a000000000000000000000000000000000000000000000000000000008152fd5b6004847f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004847fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b807fbce361b00000000000000000000000000000000000000000000000000000000060049252fd5b503461043957806003193601126104395760206040516101f48152f35b503461043957806003193601126104395760206040517f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9298152f35b50346104395760606003193601126104395760043567ffffffffffffffff8111610d3d5761102f903690600401614c7e565b60243560443581156110f457916110dd917f5e41bf0052b493123a63e4e0d9095ed4324108e489d58c9a0948b2be366ac8c6936110b8604051838551916020818189019461107e818388614d5f565b8101600b8152030190205582604051602081885161109d818388614d5f565b81016011815203019020556040519182918651928391614d5f565b8101906012825260208142930301902055604051938493608085526080850190614d80565b91602084015260408301524260608301520390a180f35b6004847fe661aed0000000000000000000000000000000000000000000000000000000008152fd5b503461043957806003193601126104395760206040517f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b088152f35b503461043957806003193601126104395760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b503461043957806003193601126104395760206040516113888152f35b5034610439576040600319360112610439576111c9614cf6565b602435604080516111da8282614c03565b600f815260208101927f6569703135353a3131313535313131000000000000000000000000000000000084528251865b600f81106113b257506014600f820152602f90205490811561138a578061134b5750915b73ffffffffffffffffffffffffffffffffffffffff8151602081855161125581838b614d5f565b8101600c815203019020541693841561132357602061127e918351809381928751928391614d5f565b8101600b815203019020549081156112fb57806112f1949596976112a185615421565b73ffffffffffffffffffffffffffffffffffffffff6112c08886614ec6565b991681526013602052205490805197889788526020880152860152606085015260c0608085015260c0840190614d80565b9060a08301520390f35b6004877fe661aed0000000000000000000000000000000000000000000000000000000008152fd5b6004877fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b929080841061135a575061122e565b86604491857fff632bea000000000000000000000000000000000000000000000000000000008352600452602452fd5b6004877fba496b84000000000000000000000000000000000000000000000000000000008152fd5b806020809286010151818401520161120a565b5034610439576020600319360112610439576004359067ffffffffffffffff821161043957602073ffffffffffffffffffffffffffffffffffffffff611412826104743660048801614c7e565b8101600c8152030190205416604051908152f35b503461043957806003193601126104395761143f6152ab565b7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840080547fffffffffffff0000000000000000000000000000000000000000000000000000811690915560a01c65ffffffffffff1661149a5780f35b7f8886ebfc4259abdbc16601dd8fb5678e54878f47b3c34836cfc51154a96051098180a180f35b5034610439576040600319360112610439576004356114de614d19565b90801561153057908161152761152261152c945f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b61539b565b615aa7565b5080f35b6004837f3fc3c27a000000000000000000000000000000000000000000000000000000008152fd5b503461043957806003193601126104395760206040517fe53b6cbb4204145187ea4c9b95f311e9ee4f2690cdb9b3a219f863f3a71e06c98152f35b5034610439578060031936011261043957604065ffffffffffff6115f97feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400549065ffffffffffff73ffffffffffffffffffffffffffffffffffffffff83169260a01c1690565b73ffffffffffffffffffffffffffffffffffffffff849392935193168352166020820152f35b50346104395780600319360112610439577feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005473ffffffffffffffffffffffffffffffffffffffff1633036117aa577feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005473ffffffffffffffffffffffffffffffffffffffff81169060a01c65ffffffffffff16801580156117a0575b611775575061170b9061170573ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840154166159dd565b5061505c565b507fffffffffffff00000000000000000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840054167feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005580f35b7f19ca5ebb000000000000000000000000000000000000000000000000000000008352600452602482fd5b50428110156116bc565b807fc22c8022000000000000000000000000000000000000000000000000000000006024925233600452fd5b503461043957602060031936011261043957604060209173ffffffffffffffffffffffffffffffffffffffff61180a614cf6565b168152601383522054604051908152f35b50346104395780600319360112610439576020611836614fd8565b65ffffffffffff60405191168152f35b5034610439578060031936011261043957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461043957806003193601126104395760206040517f0f6ee822d2ee125e4ce6edbae6c10a76fa9fd4617e0399ab687226fa334421008152f35b50346104395760206003193601126104395773ffffffffffffffffffffffffffffffffffffffff611901614cf6565b611909615313565b1680156119785773ffffffffffffffffffffffffffffffffffffffff601054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617601055167fda4281cd6f2da5f8862b210df953c55b2e8c441b67821264ef4a35ca833fc2a78380a380f35b6004827fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b5034610439576020600319360112610439576004359067ffffffffffffffff82116104395760206119d8816104743660048701614c7e565b8101601681520301902054604051908152f35b5034610439578060031936011261043957602060405160648152f35b5034610439576020600319360112610439576004359067ffffffffffffffff8211610439576020611a3f816104743660048701614c7e565b8101601581520301902054604051908152f35b5034610439576020600319360112610439576004359067ffffffffffffffff821161043957602073ffffffffffffffffffffffffffffffffffffffff611a9f826104743660048801614c7e565b8101600d8152030190205416604051908152f35b50346104395760206003193601126104395760ff604060209273ffffffffffffffffffffffffffffffffffffffff611ae9614cf6565b168152600384522054166040519015158152f35b50346104395760206003193601126104395762ffffff604060209273ffffffffffffffffffffffffffffffffffffffff611b35614cf6565b16815260048452205416604051908152f35b5034610439576020600319360112610439576004359067ffffffffffffffff8211610439576020611b7f816104743660048701614c7e565b8101600b81520301902054604051908152f35b5034610439578060031936011261043957602090604051908152f35b50346104395780600319360112610439577feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401548060d01c9182151580611c2a575b15611c21575060a01c65ffffffffffff165b6040805165ffffffffffff928316815292909116602083015290f35b0390f35b91505080611c01565b5042831015611bef565b50346104395760406003193601126104395773ffffffffffffffffffffffffffffffffffffffff6040611c65614d19565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020522091165f52602052602060ff60405f2054166040519015158152f35b50346104395780600319360112610439576020604051610bb88152f35b50346104395760206003193601126104395773ffffffffffffffffffffffffffffffffffffffff611cf7614cf6565b611cff615313565b1680156119785773ffffffffffffffffffffffffffffffffffffffff600a54827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600a55167f3aa820195fb2daaa2fb7669944e7c9eccf99303478e74f09887bd8fe649b9c588380a380f35b614e29565b503461043957604060031936011261043957611d8d614cf6565b73ffffffffffffffffffffffffffffffffffffffff611daa614d19565b91611db3615313565b169081158015611e87575b611e5f578173ffffffffffffffffffffffffffffffffffffffff6040927f37af3ddd829f67f886ff225a9b652d2104f68d4cba4cbc989264fa5ef7621ac1947fffffffffffffffffffffffff0000000000000000000000000000000000000000600754161760075516807fffffffffffffffffffffffff0000000000000000000000000000000000000000600854161760085582519182526020820152a180f35b6004837fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b5073ffffffffffffffffffffffffffffffffffffffff811615611dbe565b5034610439577f8529702b0bf1b5d9d01b0c119b695d9365ef62dc9f5e6a87c24f77bb38fd6518611ed536614cc4565b90816040516020818451611eec8183858901614d5f565b8101601681520301902055611f0660405192839283614eaa565b0390a180f35b50346104395780600319360112610439577f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040812073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561202f57611f996154d7565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b807fe2517d3f0000000000000000000000000000000000000000000000000000000060449252336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a602452fd5b5034610439578060031936011261043957602073ffffffffffffffffffffffffffffffffffffffff60105416604051908152f35b50346104395780600319360112610439576020600e54604051908152f35b50346104395760606003193601126104395760043567ffffffffffffffff8111610d3d57612103903690600401614c7e565b61210b614d19565b60443562ffffff81169182820361081c5773ffffffffffffffffffffffffffffffffffffffff8116801561231257916020916121ee9373ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541691821091825f1461230b5780925b1561230357506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156122f85773ffffffffffffffffffffffffffffffffffffffff9185916122d9575b50169081156122b157916122a0917f21e3c1439de176cb39006e603b26a8d890fe2267c804597e40d2954871141d7d93604051602081855161225a8183858a01614d5f565b8101600d815203019020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051938493606085526060850190614d80565b91602084015260408301520390a180f35b6004847f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b6122f2915060203d602011610e8557610e778183614c03565b5f612215565b6040513d86823e3d90fd5b905090610933565b8192612182565b6004867fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346104395761235a61234c36614dd5565b916123556154d7565b614ef1565b80f35b50346104395760c060031936011261043957612377614cf6565b60243590612383614d3c565b906064359262ffffff8416908185036127c75760843560a435936123a56154d7565b6123ad61552a565b6123b88684836155a1565b8473ffffffffffffffffffffffffffffffffffffffff821697888a52600360205260ff60408b205416156129b8579415612977575b15612922575b8442116128fa576020846124b0928a73ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541690818d10805f146128f35781935b501561230357506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156128795773ffffffffffffffffffffffffffffffffffffffff9189916128d4575b5016156128ac578015612884576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018390526020816044818b8b5af190811561287957889161285a575b5015612832576125588273ffffffffffffffffffffffffffffffffffffffff6008541688615760565b62ffffff73ffffffffffffffffffffffffffffffffffffffff600a5416936040519461258386614bb9565b8886526020808701918252929091166040808701828152306060890190815260808901998a5260a0890188815260c08a0188815260e08b018f815260085495517f414bf3890000000000000000000000000000000000000000000000000000000081529b5173ffffffffffffffffffffffffffffffffffffffff90811660048e01529751881660248d0152935162ffffff1660448c01529151861660648b0152995160848a0152985160a4890152975160c48801529651821660e48701529585916101049183918c91165af19283156128275787936127f3575b5082106127cb5761268673ffffffffffffffffffffffffffffffffffffffff600854168661565a565b8573ffffffffffffffffffffffffffffffffffffffff600a5416803b15610d3d578180916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528960048401525af18015610dd0576127b2575b5080808085885af16126f9614e7b565b501561278a57927ff5d6ca9b390b5271e0cbb3d43b4d708d5b17804cb81a4c65e027226d87ccf0e2949273ffffffffffffffffffffffffffffffffffffffff9260c09584600a54169060405196875260208701526040860152606085015260808401521660a0820152a160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6004867f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b816127bc91614c03565b6127c757855f6126e9565b8580fd5b6004867f8199f5f3000000000000000000000000000000000000000000000000000000008152fd5b9092506020813d60201161281f575b8161280f60209383614c03565b81010312610e075751915f61265d565b3d9150612802565b6040513d89823e3d90fd5b6004877f66b2a6fe000000000000000000000000000000000000000000000000000000008152fd5b612873915060203d602011610dc957610dbb8183614c03565b5f61252f565b6040513d8a823e3d90fd5b6004877f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004877f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b6128ed915060203d602011610e8557610e778183614c03565b5f6124d7565b8293612443565b6004887f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9350600654603c810290808204603c149015171561294a57612944904261504f565b936123f3565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8789526004602052604089205462ffffff169450846123ed576004897f3733548a000000000000000000000000000000000000000000000000000000008152fd5b60048a7f4e38f95a000000000000000000000000000000000000000000000000000000008152fd5b503461043957806003193601126104395760206040516127108152f35b503461043957604060031936011261043957612a17614cf6565b73ffffffffffffffffffffffffffffffffffffffff612a34614dc3565b9116908115611e5f5762ffffff16606481141580612ad6575b80612aca575b80612abe575b610f055760207f5734dc08ec8c21bd34e0f102d90ea2d1a9dbdcf23e787dc8744d2d0dd227fc73918385526004825260408520817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000825416179055604051908152a280f35b50612710811415612a59565b50610bb8811415612a53565b506101f4811415612a4d565b5034610439576020600319360112610439576004359067ffffffffffffffff8211610439576020612b1a816104743660048701614c7e565b8101601481520301902054604051908152f35b5034610439576020600319360112610439576004359067ffffffffffffffff8211610439576020612b65816104743660048701614c7e565b8101601181520301902054604051908152f35b503461043957612b9b612b8a36614dd5565b91612b936154d7565b61235561552a565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b50346104395760206003193601126104395760043565ffffffffffff811680820361043557612bef6152ab565b612bf842615b7a565b9065ffffffffffff612c08614fd8565b1680821115612e8457507ff1038c18cf84a56e432fdbfaf746924b7ea511dfe03a6506a0ceba4888788d9b929165ffffffffffff826206978080612c569510911802620697801816906154b9565b907feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401548060d01c80612dc3575b5050612d13817fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff79ffffffffffff00000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401549260a01b169116177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155565b612da18279ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff00000000000000000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401549260d01b169116177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155565b6040805165ffffffffffff928316815292909116602083015281908101611f06565b421115612e5a5779ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff00000000000000000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400549260301b169116177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400555b5f80612c83565b507f2b1fa2edafe6f7b9e97c1a9e0c3660e645beb2dcaa2d45bdbf9beaf5472e1ec58480a1612e53565b0365ffffffffffff8111612ebf577ff1038c18cf84a56e432fdbfaf746924b7ea511dfe03a6506a0ceba4888788d9b9291612c5691906154b9565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b5034610e075760c0600319360112610e0757612f06614cf6565b602435612f11614d3c565b6064358015908115809103610e075760843562ffffff811690818103610e075760a43573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361369b57612f796154d7565b612f8161552a565b612f8c86888a6155a1565b5f94156130d85750506040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602481018690529050602081806044810103818a73ffffffffffffffffffffffffffffffffffffffff8b165af19081156128275787916130b9575b50156130915773ffffffffffffffffffffffffffffffffffffffff7ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e49360609382935b6040519788526020880152604087015216941692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6004867f66b2a6fe000000000000000000000000000000000000000000000000000000008152fd5b6130d2915060203d602011610dc957610dbb8183614c03565b5f613012565b809192939450156136735773ffffffffffffffffffffffffffffffffffffffff871691825f52600360205260ff60405f2054161561364b579215613609575b600654603c810290808204603c14901517156135dc57613137904261504f565b8042116135b4576131ef60208573ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a541680881090815f146135ad578d915b156135a5576040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156134b05773ffffffffffffffffffffffffffffffffffffffff915f91613586575b50161561355e576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018890526020816044815f885af19081156134b0575f9161353f575b5015613517576132918773ffffffffffffffffffffffffffffffffffffffff6008541685615760565b62ffffff73ffffffffffffffffffffffffffffffffffffffff600a541694604051956132bc87614bb9565b858752602087015216604085015230606085015260808401528560a08401528060c08401525f60e084015260206133a661010473ffffffffffffffffffffffffffffffffffffffff60085416955f60405197889485937f414bf389000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af19283156134b0575f936134e3575b5082106134bb576133e09073ffffffffffffffffffffffffffffffffffffffff600854169061565a565b73ffffffffffffffffffffffffffffffffffffffff600a5416803b15610e07575f80916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528760048401525af180156134b05761349b575b508580808084875af1613453614e7b565b501561278a5773ffffffffffffffffffffffffffffffffffffffff7ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e493606093829390613055565b6134a89196505f90614c03565b5f945f613442565b6040513d5f823e3d90fd5b7f8199f5f3000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d60201161350f575b816134ff60209383614c03565b81010312610e075751915f6133b6565b3d91506134f2565b7f66b2a6fe000000000000000000000000000000000000000000000000000000005f5260045ffd5b613558915060203d602011610dc957610dbb8183614c03565b5f613268565b7f76ecffc0000000000000000000000000000000000000000000000000000000005f5260045ffd5b61359f915060203d602011610e8557610e778183614c03565b5f613216565b508c90610933565b8091613184565b7f1ab7da6b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9150805f52600460205262ffffff60405f2054169182613117577f3733548a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e38f95a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f22c50cbf000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f53e51723000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e07576020600319360112610e07576136dc614cf6565b6136e46152ab565b7f3377dc44241e779dd06afab5b788a35ca5f3b778836e2990bdb26a2a4b2e5ed6602061372161371342615b7a565b61371b614fd8565b906154b9565b65ffffffffffff73ffffffffffffffffffffffffffffffffffffffff6137897feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400549065ffffffffffff73ffffffffffffffffffffffffffffffffffffffff83169260a01c1690565b96905016947feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840054867fffffffffffff000000000000000000000000000000000000000000000000000079ffffffffffff00000000000000000000000000000000000000008660a01b16921617177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400551661382f575b65ffffffffffff60405191168152a2005b7f8886ebfc4259abdbc16601dd8fb5678e54878f47b3c34836cfc51154a96051095f80a161381e565b34610e07575f600319360112610e0757602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b34610e07575f600319360112610e0757602073ffffffffffffffffffffffffffffffffffffffff60075416604051908152f35b34610e07576040600319360112610e075760043567ffffffffffffffff8111610e07576138fd903690600401614c7e565b73ffffffffffffffffffffffffffffffffffffffff61391a614d19565b1680156139d1577f0c7d242571a289736ea536c54ebe236d31ba62abfd4f22b8d54d2988dc0dd949916139c6915f6139a76020604051855190828181890193613964818387614d5f565b8101600c815203019020857fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051809381928851928391614d5f565b8101600b81520301902055604051928392604084526040840190614d80565b9060208301520390a1005b7fd92e233d000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e07576040600319360112610e0757613a12614cf6565b73ffffffffffffffffffffffffffffffffffffffff1660243581156139d15760207f911a025fb070fa2a29c37a3bf4c00d16acf15583cd050f17bdbacbab7e72320391835f52601382528060405f2055604051908152a2005b34610e07577f57ad858a99d9aee6f1fd395e454bb1659eb8500ccb081c729a103dc2247ba3a4613a9a36614cc4565b90816040516020818451613ab18183858901614d5f565b8101601581520301902055613acb60405192839283614eaa565b0390a1005b34610e07576020600319360112610e07576004355f526002602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610e07576020600319360112610e075760045f73ffffffffffffffffffffffffffffffffffffffff613b41614cf6565b16604051928380927fa0c50b690000000000000000000000000000000000000000000000000000000082525afa9081156134b0575f91613c9b575b5060405181519060208181850193613b95818387614d5f565b8101601581520301902054918215613c735773ffffffffffffffffffffffffffffffffffffffff6040516020818451613bcf818389614d5f565b8101600c81520301902054169182156139d1576020613bf991604051809381928651928391614d5f565b8101600b81520301902054908115613c4b57611c1d91613c1882615421565b613c228582614ec6565b94604051958695865260208601526040850152606084015260a0608084015260a0830190614d80565b7fe661aed0000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f9502a873000000000000000000000000000000000000000000000000000000005f5260045ffd5b90503d805f833e613cac8183614c03565b810190602081830312610e075780519067ffffffffffffffff8211610e07570181601f82011215610e07578051613ce281614c44565b92613cf06040519485614c03565b81845260208284010111610e0757613d0e9160208085019101614d5f565b81613b7c565b34610e07575f600319360112610e0757602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b34610e07576020600319360112610e07576004355f526001602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610e07576020600319360112610e075760043567ffffffffffffffff8111610e0757613dbe602061047481933690600401614c7e565b8101601881520301902054604051908152f35b34610e07576020600319360112610e075760043567ffffffffffffffff8111610e0757613e08602061047481933690600401614c7e565b8101601781520301902054604051908152f35b34610e07575f600319360112610e0757613e33615313565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff811615613ece577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b7f8dfc202b000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e07576040600319360112610e0757600435613f12614d19565b811580614089575b613f6d575b3373ffffffffffffffffffffffffffffffffffffffff821603613f455761001a91615aa7565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005465ffffffffffff60a082901c169073ffffffffffffffffffffffffffffffffffffffff1615801590614079575b8015614067575b61403357507fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840054167feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840055613f1f565b65ffffffffffff907f19ca5ebb000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b504265ffffffffffff82161015613fc3565b5065ffffffffffff811615613fbc565b5073ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401541673ffffffffffffffffffffffffffffffffffffffff821614613f1a565b34610e07576040600319360112610e07576004356140fb614d19565b8115614142578161413d61152261001a945f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b6151d0565b7f3fc3c27a000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e07576020600319360112610e07577f424b07caa75ce8e1c3985f334273f957db9ce138de114e48e50d8240d4d7300b602060043580600655604051908152a1005b34610e07576020600319360112610e075760206141f86004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b604051908152f35b34610e07577f507273e640affcefbad497278a9b264a65c62c430dd92d24dd0d58595529539c61422f36614cc4565b908160405160208184516142468183858901614d5f565b8101601781520301902055613acb60405192839283614eaa565b34610e07575f600319360112610e0757602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b34610e07576020600319360112610e07576004355f525f602052602060405f2054604051908152f35b34610e07575f600319360112610e07576142d46152ab565b7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401548060d01c8061433d575b7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401805473ffffffffffffffffffffffffffffffffffffffff169055005b4211156143d45779ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff00000000000000000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400549260301b169116177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400555b8080614300565b507f2b1fa2edafe6f7b9e97c1a9e0c3660e645beb2dcaa2d45bdbf9beaf5472e1ec55f80a16143cd565b34610e07577f882f47825d4043cd04a564cad4f524a7fe00a604ae024c23dbc8065b77668b4761442d36614cc4565b908160405160208184516144448183858901614d5f565b8101601481520301902055613acb60405192839283614eaa565b34610e07576040600319360112610e0757614477614cf6565b61447f614d19565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1690811561491f575b506148f7577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080547fffffffffffffffffffffffffffffffffffffffffffffff000000000000000000166801000000000000000217905573ffffffffffffffffffffffffffffffffffffffff8216158080156148d9575b6139d157614533615874565b61453b615874565b6148ad57614813614819927c015180000000000000000000000000000000000000000000000000000079ffffffffffffffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005416177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400556145ce8161505c565b507fe53b6cbb4204145187ea4c9b95f311e9ee4f2690cdb9b3a219f863f3a71e06c95f8181527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020527fe3e0a451f4d1f165b1071ce13280fc8d1dfe94c2663176890cdb309635afb92180547f0f6ee822d2ee125e4ce6edbae6c10a76fa9fd4617e0399ab687226fa3344210091829055909290917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9295f8181527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb45780547f0f6ee822d2ee125e4ce6edbae6c10a76fa9fd4617e0399ab687226fa3344210091829055909290917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a47f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a5f8181527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6c80547f0f6ee822d2ee125e4ce6edbae6c10a76fa9fd4617e0399ab687226fa3344210091829055909290917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a461480381615128565b5061480d81615152565b5061517c565b506151a6565b507fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160028152a1005b7fc22c8022000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5073ffffffffffffffffffffffffffffffffffffffff821615614527565b7ff92ee8a9000000000000000000000000000000000000000000000000000000005f5260045ffd5b6002915067ffffffffffffffff161015836144b0565b34610e07577f2d57170c913282d2886a5ace7e18bed8b1c53a069f2698ae9e048bd501f3af3b61496436614cc4565b9081604051602081845161497b8183858901614d5f565b8101601881520301902055613acb60405192839283614eaa565b34610e07576040600319360112610e075760043573ffffffffffffffffffffffffffffffffffffffff8116809103610e075760243581156139d1578015614a7057478111614a48575f80808084865af16149ed614e7b565b5015614a205760207f8fcd857d6e51ec18860a6c21c1772d69a342074fbae5225c8f11f8cdf00a049691604051908152a2005b7f90b8ec18000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff4d678b8000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e07575f600319360112610e07576020604051620697808152f35b34610e07576020600319360112610e07576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610e0757807f314987860000000000000000000000000000000000000000000000000000000060209214908115614b2c575b506040519015158152f35b7f7965db0b00000000000000000000000000000000000000000000000000000000811491508115614b5f575b5082614b21565b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501482614b58565b34610e07575f600319360112610e075760209073ffffffffffffffffffffffffffffffffffffffff600854168152f35b610100810190811067ffffffffffffffff821117614bd657604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117614bd657604052565b67ffffffffffffffff8111614bd657601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610e0757803590614c9582614c44565b92614ca36040519485614c03565b82845260208383010111610e0757815f926020809301838601378301015290565b6040600319820112610e07576004359067ffffffffffffffff8211610e0757614cef91600401614c7e565b9060243590565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610e0757565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610e0757565b6044359073ffffffffffffffffffffffffffffffffffffffff82168203610e0757565b5f5b838110614d705750505f910152565b8181015183820152602001614d61565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093614dbc81518092818752878088019101614d5f565b0116010190565b6024359062ffffff82168203610e0757565b6003196060910112610e075760043573ffffffffffffffffffffffffffffffffffffffff81168103610e0757906024359060443573ffffffffffffffffffffffffffffffffffffffff81168103610e075790565b34610e07575f600319360112610e0757602073ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984015416604051908152f35b3d15614ea5573d90614e8c82614c44565b91614e9a6040519384614c03565b82523d5f602084013e565b606090565b929190614ec1602091604086526040860190614d80565b930152565b818102929181159184041417156135dc57565b90816020910312610e0757518015158103610e075790565b90602091614f7293614f048184846155a1565b5f73ffffffffffffffffffffffffffffffffffffffff6040518097819682957f47e7ef24000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0393165af19081156134b0575f91614f8d575b501561351757565b614fa6915060203d602011610dc957610dbb8183614c03565b5f614f85565b90816020910312610e07575173ffffffffffffffffffffffffffffffffffffffff81168103610e075790565b7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401548060d01c8015159081615045575b501561501c5760a01c65ffffffffffff1690565b507feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005460d01c90565b905042115f615008565b919082018092116135dc57565b73ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984015416614142578061511f6151259273ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984015416177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155565b5f6158cb565b90565b615125907f0f6ee822d2ee125e4ce6edbae6c10a76fa9fd4617e0399ab687226fa334421006158cb565b615125907fe53b6cbb4204145187ea4c9b95f311e9ee4f2690cdb9b3a219f863f3a71e06c96158cb565b615125907f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296158cb565b615125907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6158cb565b9081156151e1575b615125916158cb565b73ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401541661414257615125916152a48273ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984015416177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155565b91506151d8565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156152e357565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004525f60245260445ffd5b335f9081527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb456602052604090205460ff161561534b57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92960245260445ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156153f25750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b60405181519060208181850193615439818387614d5f565b81016016815203019020549182156154b45761546391602091604051938492839251928391614d5f565b8101601281520301902054615478828261504f565b4211615482575050565b7f2056463c000000000000000000000000000000000000000000000000000000005f526004524260245260445260645ffd5b505050565b9065ffffffffffff8091169116019065ffffffffffff82116135dc57565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300541661550257565b7fd93c0665000000000000000000000000000000000000000000000000000000005f5260045ffd5b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054146155795760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b90919073ffffffffffffffffffffffffffffffffffffffff16156139d15773ffffffffffffffffffffffffffffffffffffffff1680156139d15773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168114908115615650575b506156285715614a7057565b7f82d5d76a000000000000000000000000000000000000000000000000000000005f5260045ffd5b905030145f61561c565b6040519060205f73ffffffffffffffffffffffffffffffffffffffff828501957f095ea7b30000000000000000000000000000000000000000000000000000000087521694856024860152816044860152604485526156ba606486614c03565b84519082855af15f513d8261572e575b5050156156d657505050565b61572761572c93604051907f095ea7b300000000000000000000000000000000000000000000000000000000602083015260248201525f604482015260448152615721606482614c03565b82615bc2565b615bc2565b565b909150615758575073ffffffffffffffffffffffffffffffffffffffff81163b15155b5f806156ca565b600114615751565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000602080830191825273ffffffffffffffffffffffffffffffffffffffff85166024840152604480840196909652948252929390925f906157c5606486614c03565b84519082855af15f513d82615842575b5050156157e157505050565b61572761572c9373ffffffffffffffffffffffffffffffffffffffff604051917f095ea7b30000000000000000000000000000000000000000000000000000000060208401521660248201525f604482015260448152615721606482614c03565b90915061586c575073ffffffffffffffffffffffffffffffffffffffff81163b15155b5f806157d5565b600114615865565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156158a357565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f146159d757805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b6151259073ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401541673ffffffffffffffffffffffffffffffffffffffff821614615a3c575b5f615c49565b7fffffffffffffffffffffffff00000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840154167feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155615a36565b9061512591801580615b24575b15615c49577fffffffffffffffffffffffff00000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840154167feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155615c49565b5073ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401541673ffffffffffffffffffffffffffffffffffffffff831614615ab4565b65ffffffffffff8111615b925765ffffffffffff1690565b7f6dfcc650000000000000000000000000000000000000000000000000000000005f52603060045260245260445ffd5b905f602091828151910182855af1156134b0575f513d615c40575073ffffffffffffffffffffffffffffffffffffffff81163b155b615bfe5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b60011415615bf7565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f146159d757805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a460019056fea2646970667358221220448bc29af17350ab754979c778787c0fd9eafcddbd56cdda8cdfee5189d931b764736f6c634300081a0033" const PRC20_CREATION_BYTECODE = "608060405234801561000f575f80fd5b50600436106101a5575f3560e01c806374be2150116100e8578063c701262611610093578063eddeb1231161006e578063eddeb12314610457578063f687d12a1461046a578063f97c007a1461047d578063fc5fecd514610486575f80fd5b8063c7012626146103cb578063d9eeebed146103de578063dd62ed3e14610412575f80fd5b8063b84c8246116100c3578063b84c82461461037e578063c47f002714610391578063c6f1b7e7146103a4575f80fd5b806374be21501461033c57806395d89b4114610363578063a9059cbb1461036b575f80fd5b806323b872dd1161015357806347e7ef241161012e57806347e7ef24146102a1578063609c92b8146102b4578063701cd43b146102e857806370a0823114610307575f80fd5b806323b872dd14610266578063313ce5671461027957806342966c681461028e575f80fd5b8063091d278811610183578063091d278814610224578063095ea7b31461023b57806318160ddd1461025e575f80fd5b8063044d9371146101a957806306fdde03146101fa57806307e2bd8d1461020f575b5f80fd5b6101d07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610202610499565b6040516101f1919061143c565b61022261021d366004611479565b610529565b005b61022d60015481565b6040519081526020016101f1565b61024e610249366004611494565b6105ef565b60405190151581526020016101f1565b60065461022d565b61024e6102743660046114be565b6106ae565b60055460405160ff90911681526020016101f1565b61024e61029c3660046114fc565b61079b565b61024e6102af366004611494565b6107ae565b6102db7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101f19190611513565b5f546101d09073ffffffffffffffffffffffffffffffffffffffff1681565b61022d610315366004611479565b73ffffffffffffffffffffffffffffffffffffffff165f9081526007602052604090205490565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b610202610879565b61024e610379366004611494565b610888565b61022261038c36600461157f565b61089d565b61022261039f36600461157f565b61091c565b6101d07f000000000000000000000000000000000000000000000000000000000000000081565b61024e6103d936600461166f565b610997565b6103e6610af9565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101f1565b61022d6104203660046116e1565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260086020908152604080832093909416825291909152205490565b6102226104653660046114fc565b610d04565b6102226104783660046114fc565b610da8565b61022d60025481565b6103e66104943660046114fc565b610e4c565b6060600380546104a890611718565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490611718565b801561051f5780601f106104f65761010080835404028352916020019161051f565b820191905f5260205f20905b81548152906001019060200180831161050257829003601f168201915b5050505050905090565b73ffffffffffffffffffffffffffffffffffffffff8116610576576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f412d5a95dc32cbb6bd9319bccf1bc1febeda71e734893a440f1f6853252fe99f906020015b60405180910390a150565b5f73ffffffffffffffffffffffffffffffffffffffff831661063d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f81815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060015b92915050565b5f6106ba848484611055565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260086020908152604080832033845290915290205482811015610724576040517f10bad14700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f81815260086020908152604080832033808552908352928190208786039081905590519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506001949350505050565b5f6107a6338361119c565b506001919050565b5f6107b983836112ed565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b1660208201527f67fc7bdaed5b0ec550d8706b87d60568ab70c6b781263c70101d54cd1564aab390603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526108689186908690611769565b60405180910390a150600192915050565b6060600480546104a890611718565b5f610894338484611055565b50600192915050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461090c576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600461091882826117ef565b5050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461098b576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361091882826117ef565b5f805f6109a2610af9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018390529294509092505f918416906323b872dd906064016020604051808303815f875af1158015610a42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a669190611906565b905080610a9f576040517f0a7cd6d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aa9338661119c565b7f9ffbffc04a397460ee1dbe8c9503e098090567d6b7f4b3c02a8617d800b6d9553388888886600254604051610ae496959493929190611925565b60405180910390a15060019695505050505050565b5f80546040517f7471e6970000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152829173ffffffffffffffffffffffffffffffffffffffff1690637471e69790602401602060405180830381865afa158015610b85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba991906119a5565b915073ffffffffffffffffffffffffffffffffffffffff8216610bf8576040517f3d5729c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610c84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca891906119c0565b9050805f03610ce3576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600154610cf39083611a04565b610cfd9190611a1b565b9150509091565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d73576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028190556040518181527fef13af88e424b5d15f49c77758542c1938b08b8b95b91ed0751f98ba99000d8f906020016105e4565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e17576040517f6626eaef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018190556040518181527fff5788270f43bfc1ca41c503606d2594aa3023a1a7547de403a3e2f146a4a80a906020016105e4565b5f80546040517f7471e6970000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152829173ffffffffffffffffffffffffffffffffffffffff1690637471e69790602401602060405180830381865afa158015610ed8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efc91906119a5565b915073ffffffffffffffffffffffffffffffffffffffff8216610f4b576040517f3d5729c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517fd7fd7afb0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff9091169063d7fd7afb90602401602060405180830381865afa158015610fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ffb91906119c0565b9050805f03611036576040517fe661aed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546110438583611a04565b61104d9190611a1b565b915050915091565b73ffffffffffffffffffffffffffffffffffffffff8316158061108c575073ffffffffffffffffffffffffffffffffffffffff8216155b156110c3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f9081526007602052604090205481811015611122576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8085165f8181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061118e9086815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff82166111e9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611222576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081526007602052604090205481811015611281576040517ffe382aa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f8181526007602090815260408083208686039055600680548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff821661133a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611373576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680548201905573ffffffffffffffffffffffffffffffffffffffff82165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f81518084525f5b818110156113ff576020818501810151868301820152016113e3565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61144e60208301846113db565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611476575f80fd5b50565b5f60208284031215611489575f80fd5b813561144e81611455565b5f80604083850312156114a5575f80fd5b82356114b081611455565b946020939093013593505050565b5f805f606084860312156114d0575f80fd5b83356114db81611455565b925060208401356114eb81611455565b929592945050506040919091013590565b5f6020828403121561150c575f80fd5b5035919050565b602081016003831061154c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f6020828403121561158f575f80fd5b813567ffffffffffffffff8111156115a5575f80fd5b8201601f810184136115b5575f80fd5b803567ffffffffffffffff8111156115cf576115cf611552565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561163b5761163b611552565b604052818152828201602001861015611652575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f805f60408486031215611681575f80fd5b833567ffffffffffffffff811115611697575f80fd5b8401601f810186136116a7575f80fd5b803567ffffffffffffffff8111156116bd575f80fd5b8660208284010111156116ce575f80fd5b6020918201979096509401359392505050565b5f80604083850312156116f2575f80fd5b82356116fd81611455565b9150602083013561170d81611455565b809150509250929050565b600181811c9082168061172c57607f821691505b602082108103611763577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b606081525f61177b60608301866113db565b73ffffffffffffffffffffffffffffffffffffffff9490941660208301525060400152919050565b601f8211156117ea57805f5260205f20601f840160051c810160208510156117c85750805b601f840160051c820191505b818110156117e7575f81556001016117d4565b50505b505050565b815167ffffffffffffffff81111561180957611809611552565b61181d816118178454611718565b846117a3565b6020601f82116001811461186e575f83156118385750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b1784556117e7565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b828110156118bb578785015182556020948501946001909201910161189b565b50848210156118f757868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215611916575f80fd5b8151801515811461144e575f80fd5b73ffffffffffffffffffffffffffffffffffffffff8716815260a060208201528460a0820152848660c08301375f60c086830101525f60c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801168301019050846040830152836060830152826080830152979650505050505050565b5f602082840312156119b5575f80fd5b815161144e81611455565b5f602082840312156119d0575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176106a8576106a86119d7565b808201808211156106a8576106a86119d756fea26469706673582212206be692aa215f21df823c52c689a11caa03254730bfade7b8b36788d6a72ba61764736f6c634300081a0033" diff --git a/x/uexecutor/keeper/evm.go b/x/uexecutor/keeper/evm.go index 4ab68c401..63f661217 100644 --- a/x/uexecutor/keeper/evm.go +++ b/x/uexecutor/keeper/evm.go @@ -299,49 +299,6 @@ func (k Keeper) CallPRC20Deposit( ) } -// Calls UniversalCore Contract to set gas price -func (k Keeper) CallUniversalCoreSetGasPrice( - ctx sdk.Context, - chainID string, - price *big.Int, -) (*evmtypes.MsgEthereumTxResponse, error) { - handlerAddr := common.HexToAddress(uregistrytypes.SYSTEM_CONTRACTS["UNIVERSAL_CORE"].Address) - - abi, err := types.ParseUniversalCoreABI() - if err != nil { - return nil, errors.Wrap(err, "failed to parse Handler Contract ABI") - } - - ueModuleAccAddress, _ := k.GetUeModuleAddress(ctx) - - // Before sending an EVM tx from module - nonce, err := k.GetModuleAccountNonce(ctx) - if err != nil { - return nil, err - } - - // increment first (safe for internal modules) - if _, err := k.IncrementModuleAccountNonce(ctx); err != nil { - return nil, err - } - - return k.evmKeeper.DerivedEVMCall( - ctx, - abi, - ueModuleAccAddress, // who is sending the transaction - handlerAddr, // destination: Handler contract - big.NewInt(0), - nil, - true, // commit = true (real tx, not simulation) - false, // gasless = false (@dev: we need gas to be emitted in the tx receipt) - true, // module sender = true - &nonce, // manual nonce of module - "setGasPrice", - chainID, - price, - ) -} - // Calls UniversalCore Contract to set chain metadata (gas price + chain height). // The contract uses block.timestamp for the observed-at value. func (k Keeper) CallUniversalCoreSetChainMeta( diff --git a/x/uexecutor/keeper/gas_fee.go b/x/uexecutor/keeper/gas_fee.go index 5ff064e18..3f9780d66 100644 --- a/x/uexecutor/keeper/gas_fee.go +++ b/x/uexecutor/keeper/gas_fee.go @@ -48,14 +48,12 @@ func (k Keeper) GetOutboundTxGasAndFees(ctx sdk.Context, prc20 common.Address, g gasFee := results[1].(*big.Int) // protocolFee := results[2].(*big.Int) — not needed for outbound fields gasPrice := results[3].(*big.Int) - - // Derive gasLimit from gasFee / gasPrice - var gasLimit *big.Int - if gasPrice.Sign() > 0 { - gasLimit = new(big.Int).Div(gasFee, gasPrice) - } else { - gasLimit = big.NewInt(0) - } + // chainNamespace := results[4].(string) — not needed for outbound fields + // gasLimitUsed (results[5]) is the exact gas limit the contract resolved + // (caller-supplied or per-chain baseGasLimitByChainNamespace fallback). + // Reading it directly avoids the gasFee/gasPrice round-trip and keeps us + // in lock-step with the contract's own resolution. + gasLimit := results[5].(*big.Int) return &GasFeeInfo{ GasToken: gasToken, diff --git a/x/uexecutor/keeper/gas_fee_test.go b/x/uexecutor/keeper/gas_fee_test.go new file mode 100644 index 000000000..e73869494 --- /dev/null +++ b/x/uexecutor/keeper/gas_fee_test.go @@ -0,0 +1,82 @@ +package keeper_test + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/pushchain/push-chain-node/x/uexecutor/types" + "github.com/stretchr/testify/require" +) + +// TestUniversalCoreABI_GetOutboundTxGasAndFees_Has6Outputs locks in the new +// post-audit schema (the contract added gasLimitUsed as a 6th output). +// Catches accidental ABI reverts and proves Pack/Unpack round-trips. +func TestUniversalCoreABI_GetOutboundTxGasAndFees_Has6Outputs(t *testing.T) { + abi, err := types.ParseUniversalCoreABI() + require.NoError(t, err) + + method, ok := abi.Methods["getOutboundTxGasAndFees"] + require.True(t, ok, "getOutboundTxGasAndFees missing from ABI") + require.Len(t, method.Outputs, 6, "expected 6 outputs (post-audit schema added gasLimitUsed)") + + // Output names must match the contract field names so future readers can + // map results[i] back to the contract source unambiguously. + wantNames := []string{"gasToken", "gasFee", "protocolFee", "gasPrice", "chainNamespace", "gasLimitUsed"} + for i, want := range wantNames { + require.Equal(t, want, method.Outputs[i].Name, "output[%d] name mismatch", i) + } + + // Round-trip: pack a fake response, unpack it, get the same values back. + // This is the contract that GetOutboundTxGasAndFees in keeper/gas_fee.go + // relies on (results[0]=gasToken, results[1]=gasFee, results[3]=gasPrice, + // results[5]=gasLimit). + wantGasToken := common.HexToAddress("0x0000000000000000000000000000000000001111") + wantGasFee := big.NewInt(123_456) + wantProtocolFee := big.NewInt(789) + wantGasPrice := big.NewInt(10) + wantChainNs := "eip155:1" + wantGasLimit := big.NewInt(50_000) // intentionally != gasFee/gasPrice (=12345) + + encoded, err := method.Outputs.Pack( + wantGasToken, + wantGasFee, + wantProtocolFee, + wantGasPrice, + wantChainNs, + wantGasLimit, + ) + require.NoError(t, err) + + results, err := method.Outputs.Unpack(encoded) + require.NoError(t, err) + require.Len(t, results, 6) + + require.Equal(t, wantGasToken, results[0].(common.Address)) + require.Equal(t, 0, wantGasFee.Cmp(results[1].(*big.Int))) + require.Equal(t, 0, wantProtocolFee.Cmp(results[2].(*big.Int))) + require.Equal(t, 0, wantGasPrice.Cmp(results[3].(*big.Int))) + require.Equal(t, wantChainNs, results[4].(string)) + require.Equal(t, 0, wantGasLimit.Cmp(results[5].(*big.Int)), + "results[5] (gasLimitUsed) must be the value the contract returned, "+ + "not derived from gasFee/gasPrice") + + // Belt-and-suspenders: the post-audit chain code reads gasLimit from + // results[5] directly. If anyone ever regresses to the old + // `gasLimit = gasFee/gasPrice` derivation, the value would be 12345, + // not 50000. Encode that expectation explicitly. + derived := new(big.Int).Div(wantGasFee, wantGasPrice) + require.NotEqual(t, 0, derived.Cmp(results[5].(*big.Int)), + "gasLimit must come from results[5], NOT from gasFee/gasPrice division") +} + +// TestUniversalCoreABI_SetGasPrice_Removed locks in that the deprecated +// setGasPrice function has been removed from the ABI (deleted in the +// post-audit contract; chain wrapper CallUniversalCoreSetGasPrice was +// removed as dead code). +func TestUniversalCoreABI_SetGasPrice_Removed(t *testing.T) { + abi, err := types.ParseUniversalCoreABI() + require.NoError(t, err) + _, exists := abi.Methods["setGasPrice"] + require.False(t, exists, "setGasPrice must be removed from ABI (deleted from contract post-audit)") +} diff --git a/x/uexecutor/types/abi.go b/x/uexecutor/types/abi.go index 8cb59cc0e..96e509d15 100644 --- a/x/uexecutor/types/abi.go +++ b/x/uexecutor/types/abi.go @@ -290,16 +290,6 @@ const UNIVERSAL_CORE_ABI = `[ "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "setGasPrice", - "inputs": [ - { "name": "chainID", "type": "string", "internalType": "string" }, - { "name": "price", "type": "uint256", "internalType": "uint256" } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, { "type": "function", "name": "setChainMeta", @@ -379,7 +369,8 @@ const UNIVERSAL_CORE_ABI = `[ { "name": "gasFee", "type": "uint256", "internalType": "uint256" }, { "name": "protocolFee", "type": "uint256", "internalType": "uint256" }, { "name": "gasPrice", "type": "uint256", "internalType": "uint256" }, - { "name": "chainNamespace", "type": "string", "internalType": "string" } + { "name": "chainNamespace", "type": "string", "internalType": "string" }, + { "name": "gasLimitUsed", "type": "uint256", "internalType": "uint256" } ], "stateMutability": "view" }, diff --git a/x/uregistry/keeper/genesis_internal_test.go b/x/uregistry/keeper/genesis_internal_test.go index 81863b03b..a3c99ee50 100644 --- a/x/uregistry/keeper/genesis_internal_test.go +++ b/x/uregistry/keeper/genesis_internal_test.go @@ -151,7 +151,7 @@ func (t *trackerEVMKeeper) SetCode(_ sdk.Context, codeHash, code []byte) { // 3. The implementation address has non-empty CodeHash. // 4. The ProxyAdmin's storage slot 0 (Ownable.owner) is set to // PROXY_ADMIN_OWNER_ADDRESS_HEX (the F-2026-16998 EOA owner — same for all -// 46 ProxyAdmins). This is the load-bearing assertion for the +// 47 ProxyAdmins). This is the load-bearing assertion for the // "single owner controls every system-contract upgrade" trust assumption. // 5. The proxy's EIP-1967 admin slot points to the right ProxyAdmin // (PROXY_ADMIN_SLOT) and impl slot points to the right implementation @@ -164,8 +164,8 @@ func TestDeploySystemContracts_DeploysFullTripleForEveryReservedAddress(t *testi expectedOwner := common.HexToAddress(types.PROXY_ADMIN_OWNER_ADDRESS_HEX) - // Sanity: must have processed all 46 entries (6 explicit + 40 auto-reserved). - require.Len(t, types.SYSTEM_CONTRACTS, 46, "SYSTEM_CONTRACTS size drift") + // Sanity: must have processed all 47 entries (6 explicit + 41 auto-reserved). + require.Len(t, types.SYSTEM_CONTRACTS, 47, "SYSTEM_CONTRACTS size drift") for name, addrs := range types.SYSTEM_CONTRACTS { proxy := common.HexToAddress(addrs.Address) @@ -265,8 +265,12 @@ func TestDeploySystemContracts_AllReservedSlotsInABCRangeAreCovered(t *testing.T // Slots in A/B/C that uregistry does NOT own: // 0xAA — uexecutor PROXY_ADMIN (deployed by uexecutor's own genesis) - // 0xCA — USigVerifier legacy precompile (precompile dispatch beats EVM state) - uregistryDoesNotOwn := map[byte]bool{0xAA: true, 0xCA: true} + // 0xCA hosts the USigVerifier legacy precompile (testnet-live, removed on + // mainnet; the new address is 0xE1). It IS auto-reserved here: while the + // precompile is active the bytecode is shadowed by dispatch, but reserving + // the slot keeps the EOA-squatting protection (F-2026-17025) in effect + // once the precompile is removed on mainnet. + uregistryDoesNotOwn := map[byte]bool{0xAA: true} for _, hi := range []byte{0xA, 0xB, 0xC} { for lo := byte(0); lo < 0x10; lo++ { diff --git a/x/uregistry/types/constants_test.go b/x/uregistry/types/constants_test.go index 4d4ca79b0..fbf3d6aee 100644 --- a/x/uregistry/types/constants_test.go +++ b/x/uregistry/types/constants_test.go @@ -21,7 +21,7 @@ func TestReservedSlots_FullTripleDeployedForEveryUnoccupiedABCSlot(t *testing.T) occupied := map[byte]bool{ 0xAA: true, 0xB0: true, 0xB1: true, 0xB2: true, 0xBC: true, - 0xC0: true, 0xC1: true, 0xCA: true, + 0xC0: true, 0xC1: true, } for _, hi := range []byte{0xA, 0xB, 0xC} { @@ -104,11 +104,11 @@ func TestReservedSlots_NoCollisionWithProxyAdminOrImpl(t *testing.T) { // TestReservedSlots_ExpectedTotalCount fixes the count so an off-by-one in // the loop bounds (e.g. accidentally dropping AF or CF) shows up immediately. -// Pre-existing 6 + 40 newly reserved = 46. +// Pre-existing 6 + 41 newly reserved = 47. func TestReservedSlots_ExpectedTotalCount(t *testing.T) { - require.Len(t, SYSTEM_CONTRACTS, 46, - "expected 6 pre-existing + 40 auto-reserved (15 A + 12 B + 13 C) = 46 total") - require.Len(t, BYTECODE, 46, + require.Len(t, SYSTEM_CONTRACTS, 47, + "expected 6 pre-existing + 41 auto-reserved (15 A + 12 B + 14 C) = 47 total") + require.Len(t, BYTECODE, 47, "BYTECODE must mirror SYSTEM_CONTRACTS") }