diff --git a/app/upgrades.go b/app/upgrades.go index 74b033ad..60f4b2f6 100755 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -17,6 +17,7 @@ import ( ceapayloadverificationfix "github.com/pushchain/push-chain-node/app/upgrades/cea-payload-verification-fix" chainmeta "github.com/pushchain/push-chain-node/app/upgrades/chain-meta" chainmetavotegasless "github.com/pushchain/push-chain-node/app/upgrades/chain-meta-vote-gasless" + contractauditchanges "github.com/pushchain/push-chain-node/app/upgrades/contract-audit-changes" ethhashfix "github.com/pushchain/push-chain-node/app/upgrades/eth-hash-fix" evmrpcfix "github.com/pushchain/push-chain-node/app/upgrades/evm-rpc-fix" feeabs "github.com/pushchain/push-chain-node/app/upgrades/fee-abs" @@ -65,6 +66,7 @@ var Upgrades = []upgrades.Upgrade{ purgeexpiredoutbounds.NewUpgrade(), removeutxverifier.NewUpgrade(), tssfundmigrationfixes.NewUpgrade(), + contractauditchanges.NewUpgrade(), } // RegisterUpgradeHandlers registers the chain upgrade handlers diff --git a/app/upgrades/contract-audit-changes/upgrade.go b/app/upgrades/contract-audit-changes/upgrade.go new file mode 100644 index 00000000..d29c4fde --- /dev/null +++ b/app/upgrades/contract-audit-changes/upgrade.go @@ -0,0 +1,56 @@ +package contractauditchanges + +import ( + "context" + "fmt" + + storetypes "cosmossdk.io/store/types" + upgradetypes "cosmossdk.io/x/upgrade/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + + "github.com/pushchain/push-chain-node/app/upgrades" +) + +// UpgradeName matches the chain-side change set that adapts the chain's +// UniversalCore ABI + gas-fee read path to the post-audit smart-contract +// No module ConsensusVersion is bumped for this upgrade — none of the chain +// changes touch module storage schemas, so RunMigrations is a no-op for the +// version map; this handler exists primarily as a coordination point so all +// validators flip to the new ABI / gas-fee read at the same height. +const UpgradeName = "contract-audit-changes" + +func NewUpgrade() upgrades.Upgrade { + return upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: CreateUpgradeHandler, + StoreUpgrades: storetypes.StoreUpgrades{ + Added: []string{}, + Deleted: []string{}, + }, + } +} + +func CreateUpgradeHandler( + mm upgrades.ModuleManager, + configurator module.Configurator, + _ *upgrades.AppKeepers, +) upgradetypes.UpgradeHandler { + return func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + logger := sdkCtx.Logger().With("upgrade", UpgradeName) + logger.Info("Starting upgrade handler") + + // RunMigrations is a no-op for this upgrade (no module ConsensusVersion + // bumped) but we still call it so the version map is materialised + // correctly for any modules whose code may have changed underneath. + versionMap, err := mm.RunMigrations(ctx, configurator, fromVM) + if err != nil { + return nil, fmt.Errorf("RunMigrations: %w", err) + } + + logger.Info("Upgrade complete", "upgrade", UpgradeName) + return versionMap, nil + } +} diff --git a/test/utils/bytecode.go b/test/utils/bytecode.go index 92707c09..3c054680 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 = "608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c908162bc574b146139a85750806301ffc9a7146139075780630379eae8146138a75780630615f0a21461383f5780630ac6eb7714613791578063172bfc1c146137155780631a4e49d4146136ec5780631a873ce4146136b95780631c90064a14613651578063248a9ca3146135ff5780632f2ff15d146135a257806336568abe146135385780633f4ba83a146134075780634243fbaa146133bd578063447146a2146133735780634b1d2eeb146133335780634d49fbf31461318b5780634eb7d1a11461314b5780635b549182146131185780635c975abb146130d7578063606b05a41461306a5780636435967b1461283857806364f10e501461281d57806368c70c9e146127d25780636ca752e3146127875780637574d9a01461276a578063780ad8271461206057806378a8812714611fe557806381fbadad14611fc75780638377e23014611f9357806383b94a5214611edd5780638456cb5914611db25780638f40e8f514611d9557806391d1485414611d1e5780639be7fdb214611c33578063a217fddf14611c17578063a5172ddb14611bcc578063a861469f14611b82578063ad14d38514611b38578063af90f35114611a5a578063b49f6b88146119eb578063b5d8349f1461198a578063b6322a9f1461193f578063b6aa5ce314611923578063be0580c01461177d578063c6f1b7e71461172c578063cd20c6e8146116e7578063d17c872c14611588578063d547741f14611521578063db9a0daf1461145e578063dbc1b464146113fd578063dcc16b5c146111bf578063dd19e75514610fd3578063e229cd7614610fb6578063ec87621c14610f7b578063eefbaa3514610e8d578063f6b9ec7c14610e70578063f881446714610672578063f8c8765e14610340578063fb46e99d146103225763fc6b5de80361000f573461031f57602060031936011261031f576004359067ffffffffffffffff821161031f57602061030c816102f93660048701613a9d565b8160405193828580945193849201613b7e565b8101601281520301902054604051908152f35b80fd5b503461031f578060031936011261031f576020600654604051908152f35b503461031f57608060031936011261031f5761035a613b15565b610362613b38565b61036a613b5b565b6064359173ffffffffffffffffffffffffffffffffffffffff831680930361066e577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549360ff8560401c16159467ffffffffffffffff811680159081610666575b600114908161065c575b159081610653575b5061062b579173ffffffffffffffffffffffffffffffffffffffff80949392838860017fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000859716177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556105d6575b50610456614400565b61045e614400565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561048a614400565b61049333613f54565b50167fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a55167fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff000000000000000000000000000000000000000060085416176008557fffffffffffffffffffffffff000000000000000000000000000000000000000060095416176009556105425780f35b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f61044d565b6004877ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f6103de565b303b1591506103d6565b8791506103cc565b8480fd5b5060a060031936011261031f57610687613b15565b90610690613c24565b9160443591606435936084359273ffffffffffffffffffffffffffffffffffffffff84169283850361031f5773ffffffffffffffffffffffffffffffffffffffff601054163303610e48576106e3614255565b6106eb6142a8565b8691839773ffffffffffffffffffffffffffffffffffffffff8216948515610e20578615610e20573415610df8578815610df85762ffffff1615610db6575b15610d8e575b824211610d66576107eb60208973ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a54169488861090815f14610d5f5786915b15610d5757905b604051958694859384937f1698ee820000000000000000000000000000000000000000000000000000000085526004850191604091949373ffffffffffffffffffffffffffffffffffffffff62ffffff9281606087019816865216602085015216910152565b03915afa908115610bf8579073ffffffffffffffffffffffffffffffffffffffff918491610d28575b501615610d0057803b15610bf45781600491604051928380927fd0e30db000000000000000000000000000000000000000000000000000000000825234905af18015610c6157908291610ceb575b50600a546008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015234602482015292602092849260449284929091165af18015610c6157610cce575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a541697604051986108f98a6139d8565b89528460208a0152169182604089015230606089015260808801528560a08801523460c08801528060e088015260206109e561010473ffffffffffffffffffffffffffffffffffffffff6008541699846040519b8c9485937fdb3e2198000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af1968715610cc1578197610c89575b5080602073ffffffffffffffffffffffffffffffffffffffff600a5416604473ffffffffffffffffffffffffffffffffffffffff6008541660405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401528160248401525af18015610c6157610c6c575b506040517f42966c6800000000000000000000000000000000000000000000000000000000815286600482015260208160248185885af18015610c6157610c34575b5086340394348611610c0757873403610b2f575b505060606040967f01fd625a5ce1109c10761818e2ef64ea92cd4966d78086d37e5a4b50e322687892885191825287602083015288820152a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b73ffffffffffffffffffffffffffffffffffffffff600a5416803b15610c03578280916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528c60048401525af18015610bf8579183918893610bda575b5081809381925af1610ba6613e17565b5015610bb25780610ac6565b807f90b8ec180000000000000000000000000000000000000000000000000000000060049252fd5b610be79193508290613a22565b610bf4578186915f610b96565b5080fd5b6040513d85823e3d90fd5b8280fd5b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b610c559060203d602011610c5a575b610c4d8183613a22565b810190613d18565b610ab2565b503d610c43565b6040513d84823e3d90fd5b610c849060203d602011610c5a57610c4d8183613a22565b610a70565b9096506020813d602011610cb9575b81610ca560209383613a22565b81010312610cb55751955f6109f5565b5f80fd5b3d9150610c98565b50604051903d90823e3d90fd5b610ce69060203d602011610c5a57610c4d8183613a22565b6108cd565b81610cf591613a22565b61031f57805f610862565b6004827f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b610d4a915060203d602011610d50575b610d428183613a22565b810190613dde565b5f610814565b503d610d38565b508590610785565b809161077e565b6004827f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9150600654603c810290808204603c1490151715610c0757610db09042613e0a565b91610730565b8483526004602052604083205462ffffff1698508861072a575b6004837f3733548a000000000000000000000000000000000000000000000000000000008152fd5b6004847f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004847fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b807fbce361b00000000000000000000000000000000000000000000000000000000060049252fd5b503461031f578060031936011261031f5760206040516101f48152f35b503461031f57606060031936011261031f5760043567ffffffffffffffff8111610bf457610f64610ee37f5e41bf0052b493123a63e4e0d9095ed4324108e489d58c9a0948b2be366ac8c6923690600401613a9d565b602435604435610f3f6040518385519160208181890194610f05818388613b7e565b8101600b81520301902055826040516020818851610f24818388613b7e565b81016011815203019020556040519182918651928391613b7e565b8101906012825260208142930301902055604051938493608085526080850190613b9f565b91602084015260408301524260608301520390a180f35b503461031f578060031936011261031f5760206040517f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b088152f35b503461031f578060031936011261031f5760206040516113888152f35b503461031f57604060031936011261031f57610fed613b15565b73ffffffffffffffffffffffffffffffffffffffff6024359116906040517fa0c50b690000000000000000000000000000000000000000000000000000000081528381600481865afa9081156111b4578491611192575b50604051918151926020818185019561105e818389613b7e565b81016014815203019020549080155f1461115457505b73ffffffffffffffffffffffffffffffffffffffff604051602081855161109c81838a613b7e565b8101600c815203019020541692831561112c5760206110c691604051809381928751928391613b7e565b8101600b81520301902054908115611104576111009394956110ea60409284613d05565b9681526013602052205460405195869586613be2565b0390f35b6004867fe661aed0000000000000000000000000000000000000000000000000000000008152fd5b6004867fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b908082106111625750611074565b85906044927fff632bea000000000000000000000000000000000000000000000000000000008352600452602452fd5b6111ae91503d8086833e6111a68183613a22565b810190613ca6565b5f611044565b6040513d86823e3d90fd5b503461031f57606060031936011261031f5760043567ffffffffffffffff8111610bf4576111f1903690600401613a9d565b6111f9613b38565b60443562ffffff81169182820361066e57611212613e46565b73ffffffffffffffffffffffffffffffffffffffff8116801561112c57916020916112e49373ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541691821091825f146113f65780925b156113ee57506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156111b45773ffffffffffffffffffffffffffffffffffffffff9185916113cf575b50169081156113a75791611396917f21e3c1439de176cb39006e603b26a8d890fe2267c804597e40d2954871141d7d9360405160208185516113508183858a01613b7e565b8101600d815203019020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051938493606085526060850190613b9f565b91602084015260408301520390a180f35b6004847f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b6113e8915060203d602011610d5057610d428183613a22565b5f61130b565b905090610785565b8192611278565b503461031f57602060031936011261031f576004359067ffffffffffffffff821161031f57602073ffffffffffffffffffffffffffffffffffffffff61144a826102f93660048801613a9d565b8101600c8152030190205416604051908152f35b503461031f57602060031936011261031f576004358180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156114f9576020817f424b07caa75ce8e1c3985f334273f957db9ce138de114e48e50d8240d4d7300b92600655604051908152a180f35b6004827f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b503461031f57604060031936011261031f57611584600435611541613b38565b9061157f61157a825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b613ece565b61414d565b5080f35b503461031f57604060031936011261031f576115a2613b15565b6115aa613c24565b908280527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040832073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156116bf5773ffffffffffffffffffffffffffffffffffffffff169081156116975762ffffff169060648214158061168b575b8061167f575b80611673575b610dd0578252600460205260408220907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000082541617905580f35b50612710821415611639565b50610bb8821415611633565b506101f482141561162d565b6004837fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b6004837f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b503461031f57602060031936011261031f57604060209173ffffffffffffffffffffffffffffffffffffffff61171b613b15565b168152601383522054604051908152f35b503461031f578060031936011261031f57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461031f57606060031936011261031f57611797613b15565b61179f613b38565b6117a7613b5b565b918380527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040842073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156118fb5773ffffffffffffffffffffffffffffffffffffffff16801580156118dd575b80156118bf575b610e205773ffffffffffffffffffffffffffffffffffffffff929183917fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff00000000000000000000000000000000000000006008541617600855167fffffffffffffffffffffffff0000000000000000000000000000000000000000600954161760095580f35b5073ffffffffffffffffffffffffffffffffffffffff831615611822565b5073ffffffffffffffffffffffffffffffffffffffff82161561181b565b6004847f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b503461031f578060031936011261031f57602060405160648152f35b503461031f57602060031936011261031f576004359067ffffffffffffffff821161031f576020611977816102f93660048701613a9d565b8101601581520301902054604051908152f35b503461031f57602060031936011261031f576004359067ffffffffffffffff821161031f57602073ffffffffffffffffffffffffffffffffffffffff6119d7826102f93660048801613a9d565b8101600d8152030190205416604051908152f35b503461031f577f57ad858a99d9aee6f1fd395e454bb1659eb8500ccb081c729a103dc2247ba3a4611a1b36613ae3565b90611a24613e46565b816040516020818451611a3a8183858901613b7e565b8101601581520301902055611a5460405192839283613c8a565b0390a180f35b503461031f57602060031936011261031f57611a74613b15565b8180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156114f95773ffffffffffffffffffffffffffffffffffffffff168015611b10577fffffffffffffffffffffffff0000000000000000000000000000000000000000601054161760105580f35b6004827fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b503461031f57602060031936011261031f5760ff604060209273ffffffffffffffffffffffffffffffffffffffff611b6e613b15565b168152600384522054166040519015158152f35b503461031f57602060031936011261031f5762ffffff604060209273ffffffffffffffffffffffffffffffffffffffff611bba613b15565b16815260048452205416604051908152f35b503461031f57602060031936011261031f576004359067ffffffffffffffff821161031f576020611c04816102f93660048701613a9d565b8101600b81520301902054604051908152f35b503461031f578060031936011261031f57602090604051908152f35b503461031f57604060031936011261031f5760043567ffffffffffffffff8111610bf457611c65903690600401613a9d565b73ffffffffffffffffffffffffffffffffffffffff611c82613b38565b611c8a613e46565b168015611697577f0c7d242571a289736ea536c54ebe236d31ba62abfd4f22b8d54d2988dc0dd94991611d12916040516020818451611ccc8183858901613b7e565b8101600c815203019020817fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051928392604084526040840190613b9f565b9060208301520390a180f35b503461031f57604060031936011261031f5773ffffffffffffffffffffffffffffffffffffffff6040611d4f613b38565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020522091165f52602052602060ff60405f2054166040519015158152f35b503461031f578060031936011261031f576020604051610bb88152f35b503461031f578060031936011261031f578080527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040812073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611eb557611e1f614255565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b807f49e27cff0000000000000000000000000000000000000000000000000000000060049252fd5b503461031f57602060031936011261031f57611ef7613b15565b8180527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040822073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156114f95773ffffffffffffffffffffffffffffffffffffffff168015611b10577fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a5580f35b503461031f578060031936011261031f57602073ffffffffffffffffffffffffffffffffffffffff60105416604051908152f35b503461031f578060031936011261031f576020600e54604051908152f35b503461031f57611ff436613c36565b9083809394527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040832073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156116bf5761205d9293612058614255565b613d30565b80f35b503461031f5760c060031936011261031f5761207a613b15565b60243590612086613b5b565b906064359262ffffff8416908185036125415760843560a435936120a8614255565b6120b06142a8565b6120bb86848361431f565b8473ffffffffffffffffffffffffffffffffffffffff821697888a52600360205260ff60408b20541615612742579415612701575b156126ac575b844211612684576020846121b3928a73ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541690818d10805f1461267d5781935b50156113ee57506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156125e65773ffffffffffffffffffffffffffffffffffffffff91899161265e575b50161561263657801561260e576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018390526020816044818b8b5af180156125e6576125f1575b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018390526020816044818b8b5af180156125e6576125c9575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a541693604051946122be866139d8565b8886526020808701918252929091166040808701828152306060890190815260808901998a5260a0890188815260c08a0188815260e08b018f815260085495517f414bf3890000000000000000000000000000000000000000000000000000000081529b5173ffffffffffffffffffffffffffffffffffffffff90811660048e01529751881660248d0152935162ffffff1660448c01529151861660648b0152995160848a0152985160a4890152975160c48801529651821660e48701529585916101049183918c91165af1928315612562578793612595575b50821061256d5773ffffffffffffffffffffffffffffffffffffffff60085416604051907f095ea7b300000000000000000000000000000000000000000000000000000000825260048201528660248201526020816044818a8a5af1801561256257612545575b508573ffffffffffffffffffffffffffffffffffffffff600a5416803b15610bf4578180916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528960048401525af18015610c615761252c575b5080808085885af1612473613e17565b501561250457927ff5d6ca9b390b5271e0cbb3d43b4d708d5b17804cb81a4c65e027226d87ccf0e2949273ffffffffffffffffffffffffffffffffffffffff9260c09584600a54169060405196875260208701526040860152606085015260808401521660a0820152a160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6004867f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b8161253691613a22565b61254157855f612463565b8580fd5b61255d9060203d602011610c5a57610c4d8183613a22565b6123ff565b6040513d89823e3d90fd5b6004867f8199f5f3000000000000000000000000000000000000000000000000000000008152fd5b9092506020813d6020116125c1575b816125b160209383613a22565b81010312610cb55751915f612398565b3d91506125a4565b6125e19060203d602011610c5a57610c4d8183613a22565b612292565b6040513d8a823e3d90fd5b6126099060203d602011610c5a57610c4d8183613a22565b61222f565b6004877f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004877f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b612677915060203d602011610d5057610d428183613a22565b5f6121da565b8293612146565b6004887f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9350600654603c810290808204603c14901517156126d4576126ce9042613e0a565b936120f6565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8789526004602052604089205462ffffff169450846120f0576004897f3733548a000000000000000000000000000000000000000000000000000000008152fd5b60048a7f4e38f95a000000000000000000000000000000000000000000000000000000008152fd5b503461031f578060031936011261031f5760206040516127108152f35b503461031f57602060031936011261031f576004359067ffffffffffffffff821161031f5760206127bf816102f93660048701613a9d565b8101601481520301902054604051908152f35b503461031f57602060031936011261031f576004359067ffffffffffffffff821161031f57602061280a816102f93660048701613a9d565b8101601181520301902054604051908152f35b503461031f5761205d61282f36613c36565b91612058614255565b5034610cb55760c0600319360112610cb557612852613b15565b60243561285d613b5b565b6064358015918215809203610cb55760843562ffffff811690818103610cb55760a43573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303613042576128c5614255565b6128cd6142a8565b6128d884888a61431f565b5f95156129f75750506040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101869052919050602082806044810103818a73ffffffffffffffffffffffffffffffffffffffff8b165af1908115612562577ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e49460609473ffffffffffffffffffffffffffffffffffffffff9485946129d8575b505b6040519788526020880152604087015216941692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6129f09060203d602011610c5a57610c4d8183613a22565b505f61299a565b8091929395501561301a5773ffffffffffffffffffffffffffffffffffffffff871691825f52600360205260ff60405f20541615612ff2579215612fb0575b600654603c810290808204603c1490151715612f8357612a569042613e0a565b804211612f5b57612b0e60208573ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a541680881090815f14612f54578d915b15612f4c576040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa8015612e475773ffffffffffffffffffffffffffffffffffffffff915f91612f2d575b501615612f05576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018890526020816044815f885af18015612e4757612ee8575b506008546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018890526020816044815f885af18015612e4757612ecb575b5062ffffff73ffffffffffffffffffffffffffffffffffffffff600a54169460405195612c13876139d8565b858752602087015216604085015230606085015260808401528560a08401528060c08401525f60e08401526020612cfd61010473ffffffffffffffffffffffffffffffffffffffff60085416955f60405197889485937f414bf389000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af1928315612e47575f93612e97575b508210612e6f5760205f91604473ffffffffffffffffffffffffffffffffffffffff6008541660405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401528160248401525af18015612e4757612e52575b5073ffffffffffffffffffffffffffffffffffffffff600a5416803b15610cb5575f80916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528760048401525af18015612e4757612e32575b508580808084875af1612dea613e17565b50156125045773ffffffffffffffffffffffffffffffffffffffff7ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e49360609382939061299c565b612e3f9196505f90613a22565b5f945f612dd9565b6040513d5f823e3d90fd5b612e6a9060203d602011610c5a57610c4d8183613a22565b612d76565b7f8199f5f3000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d602011612ec3575b81612eb360209383613a22565b81010312610cb55751915f612d0d565b3d9150612ea6565b612ee39060203d602011610c5a57610c4d8183613a22565b612be7565b612f009060203d602011610c5a57610c4d8183613a22565b612b84565b7f76ecffc0000000000000000000000000000000000000000000000000000000005f5260045ffd5b612f46915060203d602011610d5057610d428183613a22565b5f612b35565b508c90610785565b8091612aa3565b7f1ab7da6b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9150805f52600460205262ffffff60405f2054169182612a36577f3733548a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e38f95a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f22c50cbf000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f53e51723000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610cb5577f882f47825d4043cd04a564cad4f524a7fe00a604ae024c23dbc8065b77668b4761309936613ae3565b906130a2613e46565b8160405160208184516130b88183858901613b7e565b81016014815203019020556130d260405192839283613c8a565b0390a1005b34610cb5575f600319360112610cb557602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b34610cb5575f600319360112610cb557602073ffffffffffffffffffffffffffffffffffffffff60075416604051908152f35b34610cb5576020600319360112610cb5576004355f526002602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610cb5576020600319360112610cb55760045f73ffffffffffffffffffffffffffffffffffffffff6131bc613b15565b16604051928380927fa0c50b690000000000000000000000000000000000000000000000000000000082525afa908115612e47575f91613319575b5060405181519060208181850193613210818387613b7e565b81016015815203019020549182156132f15773ffffffffffffffffffffffffffffffffffffffff604051602081845161324a818389613b7e565b8101600c81520301902054169182156132c957602061327491604051809381928651928391613b7e565b8101600b815203019020549081156132a157816132948561110094613d05565b9460405195869586613be2565b7fe661aed0000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fd92e233d000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f9502a873000000000000000000000000000000000000000000000000000000005f5260045ffd5b61332d91503d805f833e6111a68183613a22565b816131f7565b34610cb5576020600319360112610cb5576004355f526001602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610cb5576020600319360112610cb55760043567ffffffffffffffff8111610cb5576133aa60206102f981933690600401613a9d565b8101601781520301902054604051908152f35b34610cb5576020600319360112610cb55760043567ffffffffffffffff8111610cb5576133f460206102f981933690600401613a9d565b8101601681520301902054604051908152f35b34610cb5575f600319360112610cb557335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1615613510577fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff8116156134e8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b7f8dfc202b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f49e27cff000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610cb5576040600319360112610cb557613551613b38565b3373ffffffffffffffffffffffffffffffffffffffff82160361357a5761001a9060043561414d565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610cb5576040600319360112610cb55761001a6004356135c1613b38565b906135fa61157a825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b61403b565b34610cb5576020600319360112610cb55760206136496004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b604051908152f35b34610cb5577f507273e640affcefbad497278a9b264a65c62c430dd92d24dd0d58595529539c61368036613ae3565b90613689613e46565b81604051602081845161369f8183858901613b7e565b81016016815203019020556130d260405192839283613c8a565b34610cb5575f600319360112610cb557602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b34610cb5576020600319360112610cb5576004355f525f602052602060405f2054604051908152f35b34610cb5576040600319360112610cb55761372e613b15565b73ffffffffffffffffffffffffffffffffffffffff6024359161374f613e46565b169081156132c95760207f911a025fb070fa2a29c37a3bf4c00d16acf15583cd050f17bdbacbab7e72320391835f52601382528060405f2055604051908152a2005b34610cb5576040600319360112610cb5576137aa613b15565b60243590811515809203610cb557335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156135105773ffffffffffffffffffffffffffffffffffffffff165f52600360205260405f209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691161790555f80f35b34610cb5577f2d57170c913282d2886a5ace7e18bed8b1c53a069f2698ae9e048bd501f3af3b61386e36613ae3565b90613877613e46565b81604051602081845161388d8183858901613b7e565b81016017815203019020556130d260405192839283613c8a565b34610cb5577f6a59d469e3757d6e139cdf95b12740f585d553afac49b90bdbe278502a4427186138d636613ae3565b908160405160208184516138ed8183858901613b7e565b8101600b815203019020556130d260405192839283613c8a565b34610cb5576020600319360112610cb5576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610cb557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561397e575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501482613973565b34610cb5575f600319360112610cb55760209073ffffffffffffffffffffffffffffffffffffffff600854168152f35b610100810190811067ffffffffffffffff8211176139f557604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176139f557604052565b67ffffffffffffffff81116139f557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610cb557803590613ab482613a63565b92613ac26040519485613a22565b82845260208383010111610cb557815f926020809301838601378301015290565b6040600319820112610cb5576004359067ffffffffffffffff8211610cb557613b0e91600401613a9d565b9060243590565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610cb557565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610cb557565b6044359073ffffffffffffffffffffffffffffffffffffffff82168203610cb557565b5f5b838110613b8f5750505f910152565b8181015183820152602001613b80565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613bdb81518092818752878088019101613b7e565b0116010190565b919260a09373ffffffffffffffffffffffffffffffffffffffff613c219796931684526020840152604083015260608201528160808201520190613b9f565b90565b6024359062ffffff82168203610cb557565b6003196060910112610cb55760043573ffffffffffffffffffffffffffffffffffffffff81168103610cb557906024359060443573ffffffffffffffffffffffffffffffffffffffff81168103610cb55790565b929190613ca1602091604086526040860190613b9f565b930152565b602081830312610cb55780519067ffffffffffffffff8211610cb5570181601f82011215610cb5578051613cd981613a63565b92613ce76040519485613a22565b81845260208284010111610cb557613c219160208085019101613b7e565b81810292918115918404141715612f8357565b90816020910312610cb557518015158103610cb55790565b90602091613db193613d4381848461431f565b5f73ffffffffffffffffffffffffffffffffffffffff6040518097819682957f47e7ef24000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0393165af18015612e4757613dc35750565b613ddb9060203d602011610c5a57610c4d8183613a22565b50565b90816020910312610cb5575173ffffffffffffffffffffffffffffffffffffffff81168103610cb55790565b91908201809211612f8357565b3d15613e41573d90613e2882613a63565b91613e366040519384613a22565b82523d5f602084013e565b606090565b335f9081527f06484cc59dc38e4f67c31122333a17ca81b3ca18cdf02bfc298072fa52b0316a602052604090205460ff1615613e7e57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0860245260445ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615613f255750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff166140365773ffffffffffffffffffffffffffffffffffffffff165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461414757805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461414757805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300541661428057565b7fd93c0665000000000000000000000000000000000000000000000000000000005f5260045ffd5b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054146142f75760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b90919073ffffffffffffffffffffffffffffffffffffffff16156132c95773ffffffffffffffffffffffffffffffffffffffff1680156132c95773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681149081156143f6575b506143ce57156143a657565b7f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f82d5d76a000000000000000000000000000000000000000000000000000000005f5260045ffd5b905030145f61439a565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561442f57565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffdfea264697066735822122092328db215d1dba4578f8d74c1f15c59cabbce608e05ddc6ddbf2facfc2530ce64736f6c634300081a0033" +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 a399f365..5b0aaa8e 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 5ff064e1..3f9780d6 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 00000000..e7386949 --- /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 38503208..23ab91fa 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", @@ -423,7 +413,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" },