diff --git a/contracts/hardhat.config.js b/contracts/hardhat.config.js index 7be091910..bc7ef7531 100644 --- a/contracts/hardhat.config.js +++ b/contracts/hardhat.config.js @@ -3,8 +3,9 @@ export default { solidity: { compilers: [ { - version: "0.8.20", + version: "0.8.26", settings: { + evmVersion: "cancun", optimizer: { enabled: true, runs: 100, diff --git a/contracts/package-lock.json b/contracts/package-lock.json index 7438800f2..8f1b08211 100644 --- a/contracts/package-lock.json +++ b/contracts/package-lock.json @@ -12,7 +12,7 @@ "@account-abstraction/contracts": "^0.6.0" }, "devDependencies": { - "@openzeppelin/contracts": "^4.9.6", + "@openzeppelin/contracts": "^5.3.0", "hardhat": "^3.0.15" } }, @@ -802,9 +802,9 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", - "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.6.1.tgz", + "integrity": "sha512-Ly6SlsVJ3mj+b18W3R8gNufB7dTICT105fJhodGAGgyC2oqnBAhqSiNDJ8V8DLY05cCz81GLI0CU5vNYA1EC/w==", "dev": true, "license": "MIT" }, diff --git a/contracts/package.json b/contracts/package.json index 3acaf6ee2..be414df04 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -3,7 +3,7 @@ "version": "2.0.0", "description": "A collection of smart contracts used in the development of the Cosmos EVM blockchain.", "devDependencies": { - "@openzeppelin/contracts": "^4.9.6", + "@openzeppelin/contracts": "^5.3.0", "hardhat": "^3.0.15" }, "scripts": { diff --git a/contracts/solidity/ContractCreationTester.json b/contracts/solidity/ContractCreationTester.json index 561535a91..087ca3d49 100644 --- a/contracts/solidity/ContractCreationTester.json +++ b/contracts/solidity/ContractCreationTester.json @@ -275,11 +275,11 @@ "type": "receive" } ], - "bytecode": "0x6080806040523461001657611004908161001b8239f35b5f80fdfe60406080815260048036101561001e575b5050361561001c575f80fd5b005b5f91823560e01c80630881139714610a9b5780637a0aaa5b146108a25780637d5b95391461076d578063aabf108614610595578063b203934e14610578578063c242737f146104fa578063c53e5ae31461044b578063e71b671a1461025e5763edab92991461008d5750610010565b61009636610bc9565b919290948451906353266bbb60e01b808352826100b96020978630868501610c1a565b0392868161080095818d885af1801561025457610237575b508651975f80516020610faf83398151915289806100ef839c610c74565b0390a187516101e9808201908282106001600160401b03831117610224579189818e9593829a99989795610da6833986815203019082f087816101e4575050508960808a518b815260068c8201526563726561746560d01b60608201528489820152a15b61016a895197889687958694855230908501610c1a565b03925af180156101da576101ac575b5050516040808252600990820152683232b632b3b0ba329960b91b60608201526001602082015280608081015b0390a180f35b816101cb92903d106101d3575b6101c38183610af5565b810190610c02565b505f80610179565b503d6101b9565b83513d87823e3d90fd5b6001600160a01b03909116915f80516020610f8f833981519152919061020984610c9f565b8c51908152a28989518061021c81610cda565b0390a1610153565b634e487b7160e01b8d526041865260248dfd5b61024d90873d89116101d3576101c38183610af5565b505f6100d1565b88513d8c823e3d90fd5b506102d761026b36610b8f565b93919085519163c53e5ae360e01b83528488840152602094838680826024829886305af18c928161041c575b506103cf575050505f80516020610faf8339815191528751806102b981610d4a565b0390a15b86516353266bbb60e01b81529384928392308b8501610c1a565b0381896108005af180156103c5576103a8575b508251935f80516020610faf83398151915285806103088398610d7b565b0390a18351906101e9808301918383106001600160401b03841117610395575083918391610da6833988815203019083f080156101da576001600160a01b0316915f80516020610f8f833981519152919061036284610c9f565b8451908152a25160408082526007908201526631b932b0ba329960c91b60608201526001602082015280608081016101a6565b634e487b7160e01b895260419052602488fd5b6103be90823d84116101d3576101c38183610af5565b505f6102ea565b84513d88823e3d90fd5b6001600160a01b03909116915f80516020610f8f83398151915291906103f484610c9f565b8a51908152a25f80516020610faf83398151915287518061041481610d21565b0390a16102bd565b61043d919350823d8411610444575b6104358183610af5565b810190610d02565b915f610297565b503d61042b565b508260203660031901126104f75781516101e9808201908282106001600160401b038311176104e4576020918391610da683398481520301908435f0156104d957815162461bcd60e51b8152602081850152602160248201527f496e74656e74696f6e616c20726576657274206166746572206372656174696f6044820152603760f91b6064820152608490fd5b9051903d90823e3d90fd5b634e487b7160e01b845260418652602484fd5b80fd5b50919034610574576020366003190112610574578035915482101561053b5760208361052584610ac9565b905491519160018060a01b039160031b1c168152f35b606490602084519162461bcd60e51b83528201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152fd5b5080fd5b838234610574578160031936011261057457602091549051908152f35b5061061290836105a436610b8f565b91959085519063c53e5ae360e01b97888352858a84015260209583878082602482988d305af18a928161074e575b50610701575050505f80516020610faf8339815191528851806105f481610d4a565b0390a15b87516353266bbb60e01b81529384928392308d8501610c1a565b0381876108005af180156106f7576106da575b50808451965f80516020610faf8339815191528880610644839b610d7b565b0390a18551968752860152818560248186305af1809584966106bb575b5061069657506080935060108351938085528401526f18dc99585d194c97dc995d995c9d195960821b6060840152820152a180f35b92936001600160a01b0316925f80516020610f8f833981519152925061036284610c9f565b6106d3919650833d8511610444576104358183610af5565b945f610661565b6106f090833d85116101d3576101c38183610af5565b505f610625565b85513d86823e3d90fd5b6001600160a01b03909116915f80516020610f8f833981519152919061072684610c9f565b8b51908152a25f80516020610faf83398151915288518061074681610d21565b0390a16105f8565b610766919350823d8411610444576104358183610af5565b915f6105d2565b509061077836610bc9565b90949283516353266bbb60e01b958682528161079a6020968530858501610c1a565b0391858161080094818d875af180156108985761087b575b508551965f80516020610faf83398151915288806107d0839b610c74565b0390a186516101e9808201908282106001600160401b0383111761086857828d9493928a92610da683398581520301908bf0998a1561085e575f80516020610f8f83398151915288809a9b9c60018060a09c9b9c1b03169261083184610c9f565b8c51908152a28989518061084481610cda565b0390a161016a895197889687958694855230908501610c1a565b88513d84823e3d90fd5b634e487b7160e01b8d526041855260248dfd5b61089190863d88116101d3576101c38183610af5565b505f6107b2565b87513d8c823e3d90fd5b506108ac36610b8f565b908495929551936101e9808601908682106001600160401b03831117610a8857908691610da68339898152602096879103019082f08015610a7e576001600160a01b031692916109559186919085905f80516020610f8f83398151915290849061091584610c9f565b8b51908152a28751985f80516020610faf8339815191528a80610938839d610cda565b0390a188516353266bbb60e01b81529384928392308a8501610c1a565b03818b6108005af19081610a61575b50610a4c5785608086518781526008888201526764656c656761746560c01b60608201528987820152a15b8680808084865af13d15610a47573d6109a781610b2a565b906109b488519283610af5565b815288863d92013e5b15610a10579183917ffb17d0033e42e6a76759d2c7c2795a304dfbba80679160ae60dc91aad4966e52869560019560809851908152a2835193808552840152631cd95b9960e21b6060840152820152a180f35b845162461bcd60e51b8152808401859052601160248201527015985b1d59481cd95b990819985a5b1959607a1b6044820152606490fd5b6109bd565b85855180610a5981610d7b565b0390a161098f565b610a7790863d88116101d3576101c38183610af5565b505f610964565b86513d8a823e3d90fd5b634e487b7160e01b8a526041865260248afd5b509034610ac5576020366003190112610ac557359180548310156104f75750610525602092610ac9565b8280fd5b905f918254811015610ae15782805260208320019190565b634e487b7160e01b83526032600452602483fd5b90601f801991011681019081106001600160401b03821117610b1657604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b038111610b1657601f01601f191660200190565b81601f82011215610b8b57803590610b5c82610b2a565b92610b6a6040519485610af5565b82845260208383010111610b8b57815f926020809301838601378301015290565b5f80fd5b906080600319830112610b8b5760043591602435906001600160401b038211610b8b57610bbe91600401610b45565b906044359060643590565b6080600319820112610b8b57600435906001600160401b038211610b8b57610bf391600401610b45565b90602435906044359060643590565b90816020910312610b8b57518015158103610b8b5790565b9392919060018060a01b0316845260206060818601528151918260608701525f5b838110610c60575050506080815f8260409488010152601f8019910116850101930152565b818101830151878201608001528201610c3b565b9060408252600960408301526864656c65676174653160b81b60608301526001602060808401930152565b5f54600160401b811015610b1657806001610cbc92015f55610ac9565b819291549060031b9160018060a01b03809116831b921b1916179055565b9060408252600660408301526563726561746560d01b60608301526001602060808401930152565b90816020910312610b8b57516001600160a01b0381168103610b8b5790565b906040825260076040830152666372656174653160c81b60608301526001602060808401930152565b9060408252601060408301526f18dc99585d194c57dc995d995c9d195960821b60608301525f602060808401930152565b9060408252600860408301526764656c656761746560c01b6060830152600160206080840193015256fe6080601f6101e938819003918201601f19168301916001600160401b038311848410176100de578084926020946040528339810103126100da575180151581036100da57610095573360018060a01b03196001541617600155345f556040513481527fb263f5c1dda4b5b44a8d5658a105c64b6ec61c79463b79a1d0052a834d00fdc460203392a260405160f690816100f38239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e74656e74696f6e616c20636f6e7374727563746f722072657665727400006044820152606490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015603b575b5036156018575f80fd5b5f543481018091116027575f55005b634e487b7160e01b5f52601160045260245ffd5b5f90813560e01c90816302d05d3f146099575080632096525514607e57633fa4f24503600e5734607b5780600319360112607b5760209054604051908152f35b80fd5b5034607b5780600319360112607b5760209054604051908152f35b90503460bc578160031936011260bc576001546001600160a01b03168152602090f35b5080fdfea2646970667358221220ce8e9db4668f7bbb9824eaabdca215a30e571bb0f48c2cb0f698a8e8abc681ae64736f6c634300081400331dc05c1d6a563dddb6c22082af72b54ec2f0207ceb55db5d13cdabc208f303a99f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a264697066735822122054c08ab623063accdd988fb07fb40e2096d7699b58c373540b6cebeb2760914164736f6c63430008140033", - "deployedBytecode": "0x60406080815260048036101561001e575b5050361561001c575f80fd5b005b5f91823560e01c80630881139714610a9b5780637a0aaa5b146108a25780637d5b95391461076d578063aabf108614610595578063b203934e14610578578063c242737f146104fa578063c53e5ae31461044b578063e71b671a1461025e5763edab92991461008d5750610010565b61009636610bc9565b919290948451906353266bbb60e01b808352826100b96020978630868501610c1a565b0392868161080095818d885af1801561025457610237575b508651975f80516020610faf83398151915289806100ef839c610c74565b0390a187516101e9808201908282106001600160401b03831117610224579189818e9593829a99989795610da6833986815203019082f087816101e4575050508960808a518b815260068c8201526563726561746560d01b60608201528489820152a15b61016a895197889687958694855230908501610c1a565b03925af180156101da576101ac575b5050516040808252600990820152683232b632b3b0ba329960b91b60608201526001602082015280608081015b0390a180f35b816101cb92903d106101d3575b6101c38183610af5565b810190610c02565b505f80610179565b503d6101b9565b83513d87823e3d90fd5b6001600160a01b03909116915f80516020610f8f833981519152919061020984610c9f565b8c51908152a28989518061021c81610cda565b0390a1610153565b634e487b7160e01b8d526041865260248dfd5b61024d90873d89116101d3576101c38183610af5565b505f6100d1565b88513d8c823e3d90fd5b506102d761026b36610b8f565b93919085519163c53e5ae360e01b83528488840152602094838680826024829886305af18c928161041c575b506103cf575050505f80516020610faf8339815191528751806102b981610d4a565b0390a15b86516353266bbb60e01b81529384928392308b8501610c1a565b0381896108005af180156103c5576103a8575b508251935f80516020610faf83398151915285806103088398610d7b565b0390a18351906101e9808301918383106001600160401b03841117610395575083918391610da6833988815203019083f080156101da576001600160a01b0316915f80516020610f8f833981519152919061036284610c9f565b8451908152a25160408082526007908201526631b932b0ba329960c91b60608201526001602082015280608081016101a6565b634e487b7160e01b895260419052602488fd5b6103be90823d84116101d3576101c38183610af5565b505f6102ea565b84513d88823e3d90fd5b6001600160a01b03909116915f80516020610f8f83398151915291906103f484610c9f565b8a51908152a25f80516020610faf83398151915287518061041481610d21565b0390a16102bd565b61043d919350823d8411610444575b6104358183610af5565b810190610d02565b915f610297565b503d61042b565b508260203660031901126104f75781516101e9808201908282106001600160401b038311176104e4576020918391610da683398481520301908435f0156104d957815162461bcd60e51b8152602081850152602160248201527f496e74656e74696f6e616c20726576657274206166746572206372656174696f6044820152603760f91b6064820152608490fd5b9051903d90823e3d90fd5b634e487b7160e01b845260418652602484fd5b80fd5b50919034610574576020366003190112610574578035915482101561053b5760208361052584610ac9565b905491519160018060a01b039160031b1c168152f35b606490602084519162461bcd60e51b83528201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152fd5b5080fd5b838234610574578160031936011261057457602091549051908152f35b5061061290836105a436610b8f565b91959085519063c53e5ae360e01b97888352858a84015260209583878082602482988d305af18a928161074e575b50610701575050505f80516020610faf8339815191528851806105f481610d4a565b0390a15b87516353266bbb60e01b81529384928392308d8501610c1a565b0381876108005af180156106f7576106da575b50808451965f80516020610faf8339815191528880610644839b610d7b565b0390a18551968752860152818560248186305af1809584966106bb575b5061069657506080935060108351938085528401526f18dc99585d194c97dc995d995c9d195960821b6060840152820152a180f35b92936001600160a01b0316925f80516020610f8f833981519152925061036284610c9f565b6106d3919650833d8511610444576104358183610af5565b945f610661565b6106f090833d85116101d3576101c38183610af5565b505f610625565b85513d86823e3d90fd5b6001600160a01b03909116915f80516020610f8f833981519152919061072684610c9f565b8b51908152a25f80516020610faf83398151915288518061074681610d21565b0390a16105f8565b610766919350823d8411610444576104358183610af5565b915f6105d2565b509061077836610bc9565b90949283516353266bbb60e01b958682528161079a6020968530858501610c1a565b0391858161080094818d875af180156108985761087b575b508551965f80516020610faf83398151915288806107d0839b610c74565b0390a186516101e9808201908282106001600160401b0383111761086857828d9493928a92610da683398581520301908bf0998a1561085e575f80516020610f8f83398151915288809a9b9c60018060a09c9b9c1b03169261083184610c9f565b8c51908152a28989518061084481610cda565b0390a161016a895197889687958694855230908501610c1a565b88513d84823e3d90fd5b634e487b7160e01b8d526041855260248dfd5b61089190863d88116101d3576101c38183610af5565b505f6107b2565b87513d8c823e3d90fd5b506108ac36610b8f565b908495929551936101e9808601908682106001600160401b03831117610a8857908691610da68339898152602096879103019082f08015610a7e576001600160a01b031692916109559186919085905f80516020610f8f83398151915290849061091584610c9f565b8b51908152a28751985f80516020610faf8339815191528a80610938839d610cda565b0390a188516353266bbb60e01b81529384928392308a8501610c1a565b03818b6108005af19081610a61575b50610a4c5785608086518781526008888201526764656c656761746560c01b60608201528987820152a15b8680808084865af13d15610a47573d6109a781610b2a565b906109b488519283610af5565b815288863d92013e5b15610a10579183917ffb17d0033e42e6a76759d2c7c2795a304dfbba80679160ae60dc91aad4966e52869560019560809851908152a2835193808552840152631cd95b9960e21b6060840152820152a180f35b845162461bcd60e51b8152808401859052601160248201527015985b1d59481cd95b990819985a5b1959607a1b6044820152606490fd5b6109bd565b85855180610a5981610d7b565b0390a161098f565b610a7790863d88116101d3576101c38183610af5565b505f610964565b86513d8a823e3d90fd5b634e487b7160e01b8a526041865260248afd5b509034610ac5576020366003190112610ac557359180548310156104f75750610525602092610ac9565b8280fd5b905f918254811015610ae15782805260208320019190565b634e487b7160e01b83526032600452602483fd5b90601f801991011681019081106001600160401b03821117610b1657604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b038111610b1657601f01601f191660200190565b81601f82011215610b8b57803590610b5c82610b2a565b92610b6a6040519485610af5565b82845260208383010111610b8b57815f926020809301838601378301015290565b5f80fd5b906080600319830112610b8b5760043591602435906001600160401b038211610b8b57610bbe91600401610b45565b906044359060643590565b6080600319820112610b8b57600435906001600160401b038211610b8b57610bf391600401610b45565b90602435906044359060643590565b90816020910312610b8b57518015158103610b8b5790565b9392919060018060a01b0316845260206060818601528151918260608701525f5b838110610c60575050506080815f8260409488010152601f8019910116850101930152565b818101830151878201608001528201610c3b565b9060408252600960408301526864656c65676174653160b81b60608301526001602060808401930152565b5f54600160401b811015610b1657806001610cbc92015f55610ac9565b819291549060031b9160018060a01b03809116831b921b1916179055565b9060408252600660408301526563726561746560d01b60608301526001602060808401930152565b90816020910312610b8b57516001600160a01b0381168103610b8b5790565b906040825260076040830152666372656174653160c81b60608301526001602060808401930152565b9060408252601060408301526f18dc99585d194c57dc995d995c9d195960821b60608301525f602060808401930152565b9060408252600860408301526764656c656761746560c01b6060830152600160206080840193015256fe6080601f6101e938819003918201601f19168301916001600160401b038311848410176100de578084926020946040528339810103126100da575180151581036100da57610095573360018060a01b03196001541617600155345f556040513481527fb263f5c1dda4b5b44a8d5658a105c64b6ec61c79463b79a1d0052a834d00fdc460203392a260405160f690816100f38239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e74656e74696f6e616c20636f6e7374727563746f722072657665727400006044820152606490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015603b575b5036156018575f80fd5b5f543481018091116027575f55005b634e487b7160e01b5f52601160045260245ffd5b5f90813560e01c90816302d05d3f146099575080632096525514607e57633fa4f24503600e5734607b5780600319360112607b5760209054604051908152f35b80fd5b5034607b5780600319360112607b5760209054604051908152f35b90503460bc578160031936011260bc576001546001600160a01b03168152602090f35b5080fdfea2646970667358221220ce8e9db4668f7bbb9824eaabdca215a30e571bb0f48c2cb0f698a8e8abc681ae64736f6c634300081400331dc05c1d6a563dddb6c22082af72b54ec2f0207ceb55db5d13cdabc208f303a99f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a264697066735822122054c08ab623063accdd988fb07fb40e2096d7699b58c373540b6cebeb2760914164736f6c63430008140033", + "bytecode": "0x60808060405234601557610ed6908161001a8239f35b5f80fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c806308811397146109ce5780637a0aaa5b146108045780637d5b953914610703578063aabf1086146105a9578063b203934e1461058d578063c242737f14610511578063c53e5ae31461047d578063e71b671a1461027e5763edab92990361000e576100b1602061008f36610ad8565b929491604094919451809381926353266bbb60e01b8352883060048501610bb2565b03815f6108005af180156101f457610261575b505f80516020610e81833981519152604051806100e081610c1d565b0390a1604051926101c892838501948086106001600160401b0387111761024d5760208161016e978297610c9983395f815203019082f0806101ff5750505f80516020610e81833981519152608060405160408152600660408201526563726561746560d01b60608201525f86820152a15b6040516353266bbb60e01b815293849283923060048501610bb2565b03815f6108005af180156101f4576101c7575b5f80516020610e81833981519152604051806101c281906040825260096040830152683232b632b3b0ba329960b91b60608301526001602060808401930152565b0390a1005b6101e89060203d6020116101ed575b6101e08183610a1c565b810190610b9a565b610181565b503d6101d6565b6040513d5f823e3d90fd5b6001600160a01b0316905f80516020610e6183398151915290859061022384610b11565b604051908152a25f80516020610e818339815191526040518061024581610b72565b0390a1610152565b634e487b7160e01b5f52604160045260245ffd5b6102799060203d6020116101ed576101e08183610a1c565b6100c4565b60206102f661028c36610a9e565b949260409291925163c53e5ae360e01b8152816004820152848160248185305af15f918161044e575b506103e45750505f80516020610e81833981519152604051806102d781610c67565b0390a16040516353266bbb60e01b815293849283923060048501610bb2565b03815f6108005af180156101f4576103c7575b505f80516020610e818339815191526040518061032581610bf3565b0390a16040516101c8808201908282106001600160401b0383111761024d576020918391610c9983395f815203019082f080156101f4576001600160a01b0316905f80516020610e618339815191529060209061038184610b11565b604051908152a25f80516020610e81833981519152604051806101c2819060408252600760408301526631b932b0ba329960c91b60608301526001602060808401930152565b6103df9060203d6020116101ed576101e08183610a1c565b610309565b6001600160a01b0316905f80516020610e6183398151915290859061040884610b11565b604051908152a25f80516020610e818339815191526040518061024581906040825260076040830152666372656174653160c81b60608301526001602060808401930152565b61046f919250863d8811610476575b6104678183610a1c565b810190610c48565b90886102b5565b503d61045d565b602036600319011261050d576040516101c8808201908282106001600160401b0383111761024d576020918391610c9983395f8152030190600435f0156101f45760405162461bcd60e51b815260206004820152602160248201527f496e74656e74696f6e616c20726576657274206166746572206372656174696f6044820152603760f91b6064820152608490fd5b5f80fd5b3461050d57602036600319011261050d576004355f54811015610552576105396020916109f2565b905460405160039290921b1c6001600160a01b03168152f35b60405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606490fd5b3461050d575f36600319011261050d5760205f54604051908152f35b60206106016105b736610a9e565b949260409291925163c53e5ae360e01b815281600482015284816024815f305af15f918161044e57506103e45750505f80516020610e81833981519152604051806102d781610c67565b03815f6108005af180156101f4576106e6575b505f80516020610e818339815191526040518061063081610bf3565b0390a160405163c53e5ae360e01b8152600481018290526020816024815f305af15f91816106c5575b506106a05750505f80516020610e81833981519152608060405160408152601060408201526f18dc99585d194c97dc995d995c9d195960821b60608201525f6020820152a1005b6001600160a01b0316905f80516020610e618339815191529060209061038184610b11565b6106df91925060203d602011610476576104678183610a1c565b9083610659565b6106fe9060203d6020116101ed576101e08183610a1c565b610614565b602061073361071136610ad8565b929391604095919551809381926353266bbb60e01b8352873060048501610bb2565b03815f6108005af180156101f4576107e7575b505f80516020610e818339815191526040518061076281610c1d565b0390a16040516101c8808201908282106001600160401b0383111761024d576020918391610c9983395f815203019084f09182156101f45761016e936020936001600160a01b0316905f80516020610e618339815191529085906107c584610b11565b604051908152a25f80516020610e81833981519152604051806102d781610b72565b6107ff9060203d6020116101ed576101e08183610a1c565b610746565b61080d36610a9e565b9192906040516101c8808201908282106001600160401b0383111761024d576020918391610c9983395f815203019083f09081156101f457602094610870935f80516020610e61833981519152879460018060a01b03169788926107c584610b11565b03815f6108005af190816109b1575b5061098e575f80516020610e81833981519152608060405160408152600860408201526764656c656761746560c01b60608201525f6020820152a15b5f80808084865af13d15610989573d6108d381610a3d565b906108e16040519283610a1c565b81525f60203d92013e5b156109505760207ffb17d0033e42e6a76759d2c7c2795a304dfbba80679160ae60dc91aad4966e5291604051908152a25f80516020610e8183398151915260806040516040815260046040820152631cd95b9960e21b606082015260016020820152a1005b60405162461bcd60e51b815260206004820152601160248201527015985b1d59481cd95b990819985a5b1959607a1b6044820152606490fd5b6108eb565b5f80516020610e81833981519152604051806109a981610bf3565b0390a16108bb565b6109c99060203d6020116101ed576101e08183610a1c565b61087f565b3461050d57602036600319011261050d576004355f5481101561050d576105396020915b5f54811015610a08575f805260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90601f801991011681019081106001600160401b0382111761024d57604052565b6001600160401b03811161024d57601f01601f191660200190565b81601f8201121561050d57803590610a6f82610a3d565b92610a7d6040519485610a1c565b8284526020838301011161050d57815f926020809301838601378301015290565b90608060031983011261050d5760043591602435906001600160401b03821161050d57610acd91600401610a58565b906044359060643590565b608060031982011261050d57600435906001600160401b03821161050d57610b0291600401610a58565b90602435906044359060643590565b5f54600160401b81101561024d57600181015f555f54811015610a08575f80527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b03909216919091179055565b9060408252600660408301526563726561746560d01b60608301526001602060808401930152565b9081602091031261050d5751801515810361050d5790565b939291602060809160409360018060a01b0316875260608288015280519182918260608a0152018388015e5f828288010152601f8019910116850101930152565b9060408252600860408301526764656c656761746560c01b60608301526001602060808401930152565b9060408252600960408301526864656c65676174653160b81b60608301526001602060808401930152565b9081602091031261050d57516001600160a01b038116810361050d5790565b9060408252601060408301526f18dc99585d194c57dc995d995c9d195960821b60608301525f60206080840193015256fe6080601f6101c838819003918201601f19168301916001600160401b0383118484101760da5780849260209460405283398101031260d65751801515810360d6576091573360018060a01b03196001541617600155345f556040513481527fb263f5c1dda4b5b44a8d5658a105c64b6ec61c79463b79a1d0052a834d00fdc460203392a260405160d990816100ef8239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e74656e74696f6e616c20636f6e7374727563746f722072657665727400006044820152606490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015603b575b5036156018575f80fd5b5f543481018091116027575f55005b634e487b7160e01b5f52601160045260245ffd5b5f3560e01c90816302d05d3f146082575080632096525514606457633fa4f245146064575f600e565b34607e575f366003190112607e5760205f54604051908152f35b5f80fd5b34607e575f366003190112607e576001546001600160a01b03168152602090f3fea2646970667358221220faeefc077200d037aa04cf87e32ac73b01eecace256a582e055114440e4e3c7964736f6c634300081a00331dc05c1d6a563dddb6c22082af72b54ec2f0207ceb55db5d13cdabc208f303a99f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a2646970667358221220066731e9315d7bb40dfc28d2063a2fd57b3e3f54499b75cadbe1976ceddb225a64736f6c634300081a0033", + "deployedBytecode": "0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c806308811397146109ce5780637a0aaa5b146108045780637d5b953914610703578063aabf1086146105a9578063b203934e1461058d578063c242737f14610511578063c53e5ae31461047d578063e71b671a1461027e5763edab92990361000e576100b1602061008f36610ad8565b929491604094919451809381926353266bbb60e01b8352883060048501610bb2565b03815f6108005af180156101f457610261575b505f80516020610e81833981519152604051806100e081610c1d565b0390a1604051926101c892838501948086106001600160401b0387111761024d5760208161016e978297610c9983395f815203019082f0806101ff5750505f80516020610e81833981519152608060405160408152600660408201526563726561746560d01b60608201525f86820152a15b6040516353266bbb60e01b815293849283923060048501610bb2565b03815f6108005af180156101f4576101c7575b5f80516020610e81833981519152604051806101c281906040825260096040830152683232b632b3b0ba329960b91b60608301526001602060808401930152565b0390a1005b6101e89060203d6020116101ed575b6101e08183610a1c565b810190610b9a565b610181565b503d6101d6565b6040513d5f823e3d90fd5b6001600160a01b0316905f80516020610e6183398151915290859061022384610b11565b604051908152a25f80516020610e818339815191526040518061024581610b72565b0390a1610152565b634e487b7160e01b5f52604160045260245ffd5b6102799060203d6020116101ed576101e08183610a1c565b6100c4565b60206102f661028c36610a9e565b949260409291925163c53e5ae360e01b8152816004820152848160248185305af15f918161044e575b506103e45750505f80516020610e81833981519152604051806102d781610c67565b0390a16040516353266bbb60e01b815293849283923060048501610bb2565b03815f6108005af180156101f4576103c7575b505f80516020610e818339815191526040518061032581610bf3565b0390a16040516101c8808201908282106001600160401b0383111761024d576020918391610c9983395f815203019082f080156101f4576001600160a01b0316905f80516020610e618339815191529060209061038184610b11565b604051908152a25f80516020610e81833981519152604051806101c2819060408252600760408301526631b932b0ba329960c91b60608301526001602060808401930152565b6103df9060203d6020116101ed576101e08183610a1c565b610309565b6001600160a01b0316905f80516020610e6183398151915290859061040884610b11565b604051908152a25f80516020610e818339815191526040518061024581906040825260076040830152666372656174653160c81b60608301526001602060808401930152565b61046f919250863d8811610476575b6104678183610a1c565b810190610c48565b90886102b5565b503d61045d565b602036600319011261050d576040516101c8808201908282106001600160401b0383111761024d576020918391610c9983395f8152030190600435f0156101f45760405162461bcd60e51b815260206004820152602160248201527f496e74656e74696f6e616c20726576657274206166746572206372656174696f6044820152603760f91b6064820152608490fd5b5f80fd5b3461050d57602036600319011261050d576004355f54811015610552576105396020916109f2565b905460405160039290921b1c6001600160a01b03168152f35b60405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606490fd5b3461050d575f36600319011261050d5760205f54604051908152f35b60206106016105b736610a9e565b949260409291925163c53e5ae360e01b815281600482015284816024815f305af15f918161044e57506103e45750505f80516020610e81833981519152604051806102d781610c67565b03815f6108005af180156101f4576106e6575b505f80516020610e818339815191526040518061063081610bf3565b0390a160405163c53e5ae360e01b8152600481018290526020816024815f305af15f91816106c5575b506106a05750505f80516020610e81833981519152608060405160408152601060408201526f18dc99585d194c97dc995d995c9d195960821b60608201525f6020820152a1005b6001600160a01b0316905f80516020610e618339815191529060209061038184610b11565b6106df91925060203d602011610476576104678183610a1c565b9083610659565b6106fe9060203d6020116101ed576101e08183610a1c565b610614565b602061073361071136610ad8565b929391604095919551809381926353266bbb60e01b8352873060048501610bb2565b03815f6108005af180156101f4576107e7575b505f80516020610e818339815191526040518061076281610c1d565b0390a16040516101c8808201908282106001600160401b0383111761024d576020918391610c9983395f815203019084f09182156101f45761016e936020936001600160a01b0316905f80516020610e618339815191529085906107c584610b11565b604051908152a25f80516020610e81833981519152604051806102d781610b72565b6107ff9060203d6020116101ed576101e08183610a1c565b610746565b61080d36610a9e565b9192906040516101c8808201908282106001600160401b0383111761024d576020918391610c9983395f815203019083f09081156101f457602094610870935f80516020610e61833981519152879460018060a01b03169788926107c584610b11565b03815f6108005af190816109b1575b5061098e575f80516020610e81833981519152608060405160408152600860408201526764656c656761746560c01b60608201525f6020820152a15b5f80808084865af13d15610989573d6108d381610a3d565b906108e16040519283610a1c565b81525f60203d92013e5b156109505760207ffb17d0033e42e6a76759d2c7c2795a304dfbba80679160ae60dc91aad4966e5291604051908152a25f80516020610e8183398151915260806040516040815260046040820152631cd95b9960e21b606082015260016020820152a1005b60405162461bcd60e51b815260206004820152601160248201527015985b1d59481cd95b990819985a5b1959607a1b6044820152606490fd5b6108eb565b5f80516020610e81833981519152604051806109a981610bf3565b0390a16108bb565b6109c99060203d6020116101ed576101e08183610a1c565b61087f565b3461050d57602036600319011261050d576004355f5481101561050d576105396020915b5f54811015610a08575f805260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90601f801991011681019081106001600160401b0382111761024d57604052565b6001600160401b03811161024d57601f01601f191660200190565b81601f8201121561050d57803590610a6f82610a3d565b92610a7d6040519485610a1c565b8284526020838301011161050d57815f926020809301838601378301015290565b90608060031983011261050d5760043591602435906001600160401b03821161050d57610acd91600401610a58565b906044359060643590565b608060031982011261050d57600435906001600160401b03821161050d57610b0291600401610a58565b90602435906044359060643590565b5f54600160401b81101561024d57600181015f555f54811015610a08575f80527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b03909216919091179055565b9060408252600660408301526563726561746560d01b60608301526001602060808401930152565b9081602091031261050d5751801515810361050d5790565b939291602060809160409360018060a01b0316875260608288015280519182918260608a0152018388015e5f828288010152601f8019910116850101930152565b9060408252600860408301526764656c656761746560c01b60608301526001602060808401930152565b9060408252600960408301526864656c65676174653160b81b60608301526001602060808401930152565b9081602091031261050d57516001600160a01b038116810361050d5790565b9060408252601060408301526f18dc99585d194c57dc995d995c9d195960821b60608301525f60206080840193015256fe6080601f6101c838819003918201601f19168301916001600160401b0383118484101760da5780849260209460405283398101031260d65751801515810360d6576091573360018060a01b03196001541617600155345f556040513481527fb263f5c1dda4b5b44a8d5658a105c64b6ec61c79463b79a1d0052a834d00fdc460203392a260405160d990816100ef8239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e74656e74696f6e616c20636f6e7374727563746f722072657665727400006044820152606490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015603b575b5036156018575f80fd5b5f543481018091116027575f55005b634e487b7160e01b5f52601160045260245ffd5b5f3560e01c90816302d05d3f146082575080632096525514606457633fa4f245146064575f600e565b34607e575f366003190112607e5760205f54604051908152f35b5f80fd5b34607e575f366003190112607e576001546001600160a01b03168152602090f3fea2646970667358221220faeefc077200d037aa04cf87e32ac73b01eecace256a582e055114440e4e3c7964736f6c634300081a00331dc05c1d6a563dddb6c22082af72b54ec2f0207ceb55db5d13cdabc208f303a99f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a2646970667358221220066731e9315d7bb40dfc28d2063a2fd57b3e3f54499b75cadbe1976ceddb225a64736f6c634300081a0033", "linkReferences": {}, "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/solidity/ContractCreationTester.sol", - "buildInfoId": "solc-0_8_20-a1f91ec3b065d50730c0367f861277c93634d90c" + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" } \ No newline at end of file diff --git a/contracts/solidity/DebugPrecompileCaller.json b/contracts/solidity/DebugPrecompileCaller.json index cca7100b0..ede405aca 100644 --- a/contracts/solidity/DebugPrecompileCaller.json +++ b/contracts/solidity/DebugPrecompileCaller.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "DebugPrecompileCaller", "sourceName": "solidity/DebugPrecompileCaller.sol", "abi": [ @@ -28,8 +28,11 @@ "type": "function" } ], - "bytecode": "0x608080604052346100165761023e908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63ff585caf1461002857600080fd5b34610047576020366003190112610047576100446004356100f4565b80f35b80fd5b3d156100a65767ffffffffffffffff903d8281116100905760405192601f8201601f19908116603f01168401908111848210176100905760405282523d6000602084013e565b634e487b7160e01b600052604160045260246000fd5b606090565b6020808252825181830181905290939260005b8281106100e057505060409293506000838284010152601f8019910116010190565b8181018601518482016040015285016100be565b60005b81811061017a5750600381116101775760405190602082019060008252602183015260218252606082019082821067ffffffffffffffff8311176100905760009283926040525190826107995af161014d61004a565b90156101565750565b60405163a5fa8d2b60e01b815290819061017390600483016100ab565b0390fd5b50565b60408051600160f81b60208201908152600182528183019067ffffffffffffffff82118383101761009057600092839285525190826107995af1906101bd61004a565b91156101ec57505060001981146101d6576001016100f7565b634e487b7160e01b600052601160045260246000fd5b5163a5fa8d2b60e01b81529150819061017390600483016100ab56fea2646970667358221220f0ddd005e729c0bf54b8295a483a2d7c84c3948a24b42ea5b8f906cf9b1c361f64736f6c63430008140033", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b6000803560e01c63ff585caf1461002857600080fd5b34610047576020366003190112610047576100446004356100f4565b80f35b80fd5b3d156100a65767ffffffffffffffff903d8281116100905760405192601f8201601f19908116603f01168401908111848210176100905760405282523d6000602084013e565b634e487b7160e01b600052604160045260246000fd5b606090565b6020808252825181830181905290939260005b8281106100e057505060409293506000838284010152601f8019910116010190565b8181018601518482016040015285016100be565b60005b81811061017a5750600381116101775760405190602082019060008252602183015260218252606082019082821067ffffffffffffffff8311176100905760009283926040525190826107995af161014d61004a565b90156101565750565b60405163a5fa8d2b60e01b815290819061017390600483016100ab565b0390fd5b50565b60408051600160f81b60208201908152600182528183019067ffffffffffffffff82118383101761009057600092839285525190826107995af1906101bd61004a565b91156101ec57505060001981146101d6576001016100f7565b634e487b7160e01b600052601160045260246000fd5b5163a5fa8d2b60e01b81529150819061017390600483016100ab56fea2646970667358221220f0ddd005e729c0bf54b8295a483a2d7c84c3948a24b42ea5b8f906cf9b1c361f64736f6c63430008140033", + "bytecode": "0x608080604052346015576101cb908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c63ff585caf14610024575f80fd5b34610042576020366003190112610042576100406004356100e5565b005b5f80fd5b90601f8019910116810190811067ffffffffffffffff82111761006857604052565b634e487b7160e01b5f52604160045260245ffd5b3d156100b6573d9067ffffffffffffffff821161006857604051916100ab601f8201601f191660200184610046565b82523d5f602084013e565b606090565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b5f5b818110610156575060038111610153575f80916040516020810191838352602182015260218152610119604182610046565b5190826107995af161012961007c565b90156101325750565b60405163a5fa8d2b60e01b815290819061014f90600483016100bb565b0390fd5b50565b5f806040516020810190600160f81b825260018152610176602182610046565b5190826107995af161018661007c565b901561013257506001016100e756fea26469706673582212202f638d31db47c70af56fb87ec32a469c88e0e5c42572d081fc011b9c0370c04564736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c63ff585caf14610024575f80fd5b34610042576020366003190112610042576100406004356100e5565b005b5f80fd5b90601f8019910116810190811067ffffffffffffffff82111761006857604052565b634e487b7160e01b5f52604160045260245ffd5b3d156100b6573d9067ffffffffffffffff821161006857604051916100ab601f8201601f191660200184610046565b82523d5f602084013e565b606090565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b5f5b818110610156575060038111610153575f80916040516020810191838352602182015260218152610119604182610046565b5190826107995af161012961007c565b90156101325750565b60405163a5fa8d2b60e01b815290819061014f90600483016100bb565b0390fd5b50565b5f806040516020810190600160f81b825260018152610176602182610046565b5190826107995af161018661007c565b901561013257506001016100e756fea26469706673582212202f638d31db47c70af56fb87ec32a469c88e0e5c42572d081fc011b9c0370c04564736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/DebugPrecompileCaller.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/contracts/solidity/ERC20MinterBurnerDecimals.json b/contracts/solidity/ERC20MinterBurnerDecimals.json index d26af3b43..6a09bd9a1 100644 --- a/contracts/solidity/ERC20MinterBurnerDecimals.json +++ b/contracts/solidity/ERC20MinterBurnerDecimals.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "ERC20MinterBurnerDecimals", "sourceName": "solidity/ERC20MinterBurnerDecimals.sol", "abi": [ @@ -24,6 +24,123 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -260,7 +377,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -298,7 +415,7 @@ "inputs": [ { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -334,7 +451,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -356,30 +473,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -448,16 +541,17 @@ "internalType": "bytes32", "name": "role", "type": "bytes32" - }, + } + ], + "name": "getRoleMembers", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "address[]", + "name": "", + "type": "address[]" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -473,31 +567,25 @@ "type": "address" } ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "increaseAllowance", + "name": "hasRole", "outputs": [ { "internalType": "bool", @@ -505,7 +593,7 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -568,7 +656,7 @@ }, { "internalType": "address", - "name": "account", + "name": "callerConfirmation", "type": "address" } ], @@ -649,7 +737,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -678,7 +766,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -701,8 +789,11 @@ "type": "function" } ], - "bytecode": "0x60406080815234620005715762001f80803803806200001e8162000576565b9283398101606082820312620005715781516001600160401b039190828111620005715781620000509185016200059c565b9160209182850151828111620005715786916200006f9187016200059c565b9401519360ff851685036200057157835182811162000488576005918254916001968784811c9416801562000566575b8785101462000467578190601f9485811162000512575b508790858311600114620004aa576000926200049e575b5050600019600383901b1c191690871b1783555b805193841162000488576006548681811c911680156200047d575b86821014620004675784938382116200040d575b505084918311600114620003a35760009262000397575b5050600019600383901b1c191690831b176006555b60ff19806007541660075560008052600082528460002033600052825260ff856000205416156200035c575b600080528282526200017e33866000206200060e565b507f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a680600052600083528560002033600052835260ff8660002054161562000321575b600052828252620001d633866000206200060e565b507f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a80600052600083528560002033600052835260ff86600020541615620002e6575b6000528282526200022e33866000206200060e565b507f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8489081600052600083528560002033600052835260ff86600020541615620002aa575b50600052526200028633836000206200060e565b5061ff006007549160081b169061ff00191617600755516118c490816200069c8239f35b81600052600083528560002033600052835283866000209182541617905533338260008051602062001f60833981519152600080a43862000272565b80600052600083528560002033600052835285600020848382541617905533338260008051602062001f60833981519152600080a462000219565b80600052600083528560002033600052835285600020848382541617905533338260008051602062001f60833981519152600080a4620001c1565b6000805260008252846000203360005282528460002083828254161790553333600060008051602062001f608339815191528180a462000168565b01519050388062000127565b90859350601f198316916006600052856000209260005b87828210620003f65750508411620003dc575b505050811b016006556200013c565b015160001960f88460031b161c19169055388080620003cd565b8385015186558997909501949384019301620003ba565b90919293506006600052856000209084808701821c8301938888106200045d575b9187968a93969594929601901c01915b8281106200044d575062000110565b600081558695508891016200043e565b935082936200042e565b634e487b7160e01b600052602260045260246000fd5b90607f1690620000fc565b634e487b7160e01b600052604160045260246000fd5b015190503880620000cd565b90899350601f1983169187600052896000209260005b8b828210620004fb5750508411620004e1575b505050811b018355620000e1565b015160001960f88460031b161c19169055388080620004d3565b8385015186558d97909501949384019301620004c0565b909150856000528760002085808501881c8201928a86106200055c575b918b918695949301891c01915b8281106200054c575050620000b6565b600081558594508b91016200053c565b925081926200052f565b93607f16936200009f565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200048857604052565b919080601f84011215620005715782516001600160401b0381116200048857602090620005d2601f8201601f1916830162000576565b92818452828287010111620005715760005b818110620005fa57508260009394955001015290565b8581018301518482018401528201620005e4565b919060018301600090828252806020526040822054156000146200069557845494680100000000000000008610156200068157600186018082558610156200066d57836040949596828552602085200155549382526020522055600190565b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b83526041600452602483fd5b5092505056fe608060408181526004918236101561001657600080fd5b600092833560e01c91826301ffc9a714610d3a5750816306fdde0314610c99578163095ea7b314610c6f57816318160ddd14610c515781631cf2c7e214610b9b57816323b872dd14610b5e578163248a9ca314610b34578163282c51f314610af95781632f2ff15d14610a45578163313ce56714610a2057816336568abe1461098e578163395093511461093e5781633f4ba83a1461083057816340c10f191461069957816342966c681461067b5781635c975abb1461065757816370a082311461061f57816379cc6790146105ef5781638456cb59146104e75781639010d07c146104a657816391d148541461046057816395d89b411461037b578163a217fddf14610360578163a457c2d7146102b8578163a9059cbb14610287578163ca15c8731461025f578163d539139314610224578163d547741f146101e257508063dd62ed3e1461019a5763e63ab1e91461016f57600080fd5b346101965781600319360112610196576020905160008051602061182f8339815191528152f35b5080fd5b5034610196578060031936011261019657806020926101b7610df6565b6101bf610e11565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b9190503461022057806003193601126102205761021d91356102186001610207610e11565b938387528660205286200154610e27565b611187565b80f35b8280fd5b505034610196578160031936011261019657602090517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b9050346102205760203660031901126102205760209282913581526001845220549051908152f35b5050346101965780600319360112610196576020906102b16102a7610df6565b6024359033611231565b5160018152f35b9050823461035d578260031936011261035d576102d3610df6565b918360243592338152600360205281812060018060a01b038616825260205220549082821061030c576020856102b185850387336113f1565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b80fd5b50503461019657816003193601126101965751908152602090f35b91905034610220578260031936011261022057805191836006549060019082821c928281168015610456575b6020958686108214610443575084885290811561042157506001146103e6575b6103e286866103d8828b038361114f565b5191829182610dca565b0390f35b929550600683528583205b82841061040e57505050826103e2946103d89282010194386103c7565b80548685018801529286019281016103f1565b60ff191687860152505050151560051b83010192506103d8826103e2386103c7565b634e487b7160e01b845260229052602483fd5b93607f16936103a7565b9050346102205781600319360112610220578160209360ff92610481610e11565b903582528186528282206001600160a01b039091168252855220549151911615158152f35b9050346102205781600319360112610220576020926104d191358152600184528260243591206116b5565b905491519160018060a01b039160031b1c168152f35b90503461022057826003193601126102205760008051602061182f83398151915283528260205281832033845260205260ff82842054161561059d576007549060ff8216610567575060ff1916600117600755513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a180f35b606490602084519162461bcd60e51b8352820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152fd5b6020608492519162461bcd60e51b83528201526039602482015260008051602061186f833981519152604482015278686176652070617573657220726f6c6520746f20706175736560381b6064820152fd5b5050346101965736600319011261035d5761021d61060b610df6565b6024359061061a8233836114f3565b61158b565b5050346101965760203660031901126101965760209181906001600160a01b03610647610df6565b1681526002845220549051908152f35b50503461019657816003193601126101965760209060ff6007541690519015158152f35b8390346101965760203660031901126101965761021d90353361158b565b919050346102205780600319360112610220576106b4610df6565b90602435907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68552602092858452818620338752845260ff8287205416156107de576001600160a01b031693841561079d5760ff6007541661074957918593918361072f8360008051602061184f833981519152965461120e565b90558585526002835280852082815401905551908152a380f35b83608492519162461bcd60e51b8352820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152fd5b83606492519162461bcd60e51b8352820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b815162461bcd60e51b81528086018590526038602482015260008051602061186f8339815191526044820152771a185d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60421b6064820152608490fd5b90503461022057826003193601126102205760008051602061182f83398151915283528260205281832033845260205260ff8284205416156108e8576007549060ff8216156108ae575060ff1916600755513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b6020608492519162461bcd60e51b8352820152603b602482015260008051602061186f83398151915260448201527f686176652070617573657220726f6c6520746f20756e706175736500000000006064820152fd5b5050346101965780600319360112610196576102b1602092610987610961610df6565b338352600386528483206001600160a01b0382168452865291849020546024359061120e565b90336113f1565b839150346101965782600319360112610196576109a9610e11565b90336001600160a01b038316036109c5579061021d9135611187565b608490602085519162461bcd60e51b8352820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152fd5b50503461019657816003193601126101965760209060ff60075460081c169051908152f35b91905034610220578060031936011261022057610aae9135906001610a68610e11565b92808652602090868252610a80838589200154610e27565b80875286825283872094838060a01b031694858852825260ff848820541615610ab2575b86525283206116cd565b5080f35b8087528682528387208588528252838720805460ff1916841790553385827f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8a80a4610aa4565b505034610196578160031936011261019657602090517f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8488152f35b90503461022057602036600319011261022057816020936001923581528085522001549051908152f35b505034610196576060366003190112610196576020906102b1610b7f610df6565b610b87610e11565b60443591610b968333836114f3565b611231565b905034610220578160031936011261022057610bb5610df6565b917f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84884528360205280842033855260205260ff818520541615610bff578361021d6024358561158b565b906020608492519162461bcd60e51b83528201526038602482015260008051602061186f8339815191526044820152773430bb3290313ab93732b9103937b632903a3790313ab93760411b6064820152fd5b90503461022057826003193601126102205760209250549051908152f35b5050346101965780600319360112610196576020906102b1610c8f610df6565b60243590336113f1565b91905034610220578260031936011261022057805191836005549060019082821c928281168015610d30575b602095868610821461044357508488529081156104215750600114610cf5576103e286866103d8828b038361114f565b929550600583528583205b828410610d1d57505050826103e2946103d89282010194386103c7565b8054868501880152928601928101610d00565b93607f1693610cc5565b849134610220576020366003190112610220573563ffffffff60e01b81168091036102205760209250635a05180f60e01b8114908115610d7c575b5015158152f35b637965db0b60e01b811491508115610d96575b5083610d75565b6301ffc9a760e01b14905083610d8f565b60005b838110610dba5750506000910152565b8181015183820152602001610daa565b60409160208252610dea8151809281602086015260208686019101610da7565b601f01601f1916010190565b600435906001600160a01b0382168203610e0c57565b600080fd5b602435906001600160a01b0382168203610e0c57565b6000818152602090808252604092838220338352835260ff848320541615610e4f5750505050565b835167ffffffffffffffff919033606082018481118382101761113b578752602a825285820192873685378251156111275760308453825191600192831015611113576078602185015360295b8381116110a9575061106757908751946080860190868210908211176110535788526042855286850195606036883785511561103f5760308753855182101561103f5790607860218701536041915b818311610fd157505050610f8f57938593610f7593610f66604894610f3d76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b99610f8b9b519a8b978801525180926037880190610da7565b8401917001034b99036b4b9b9b4b733903937b6329607d1b603784015251809386840190610da7565b0103602881018552018361114f565b5162461bcd60e51b815291829160048301610dca565b0390fd5b60648587519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561102b576f181899199a1a9b1b9c1cb0b131b232b360811b901a611001858961168e565b5360041c92801561101757600019019190610eeb565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b87526041600452602487fd5b60648789519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b90600f811660108110156110ff576f181899199a1a9b1b9c1cb0b131b232b360811b901a6110d7838761168e565b5360041c9080156110eb5760001901610e9c565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b87526032600452602487fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b86526041600452602486fd5b90601f8019910116810190811067ffffffffffffffff82111761117157604052565b634e487b7160e01b600052604160045260246000fd5b9060406111c492600090808252816020528282209360018060a01b03169384835260205260ff83832054166111c7575b8152600160205220611752565b50565b8082528160205282822084835260205282822060ff1981541690553384827ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8580a46111b7565b9190820180921161121b57565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0390811691821561139e571691821561134d5760ff600754166112f557600082815260026020526040812054918083106112a1576040828260008051602061184f83398151915295876020965260028652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6001600160a01b039081169182156114a257169182156114525760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260038252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b9060018060a01b038083166000526003602052604060002090821660005260205260406000205492600019840361152b575b50505050565b8084106115465761153d9303916113f1565b38808080611525565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b6001600160a01b0316801561163f5760ff600754166112f557806000526002602052604060002054918083106115ef5760208160008051602061184f83398151915292600095858752600284520360408620558060045403600455604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b90815181101561169f570160200190565b634e487b7160e01b600052603260045260246000fd5b805482101561169f5760005260206000200190600090565b9190600183016000908282528060205260408220541560001461174c57845494600160401b8610156117385783611728611711886001604098999a018555846116b5565b819391549060031b91821b91600019901b19161790565b9055549382526020522055600190565b634e487b7160e01b83526041600452602483fd5b50925050565b906001820190600092818452826020526040842054908115156000146118275760001991808301818111611813578254908482019182116110eb578082036117de575b505050805480156117ca578201916117ad83836116b5565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6117fe6117ee61171193866116b5565b90549060031b1c928392866116b5565b90558652846020526040862055388080611795565b634e487b7160e01b87526011600452602487fd5b505050509056fe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332304d696e7465724275726e6572446563696d616c733a206d75737420a2646970667358221220ce1ae6525e01655a7cc9c91e11284a74018763a1d850a7c67f6a12c52b68836964736f6c634300081400332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", - "deployedBytecode": "0x608060408181526004918236101561001657600080fd5b600092833560e01c91826301ffc9a714610d3a5750816306fdde0314610c99578163095ea7b314610c6f57816318160ddd14610c515781631cf2c7e214610b9b57816323b872dd14610b5e578163248a9ca314610b34578163282c51f314610af95781632f2ff15d14610a45578163313ce56714610a2057816336568abe1461098e578163395093511461093e5781633f4ba83a1461083057816340c10f191461069957816342966c681461067b5781635c975abb1461065757816370a082311461061f57816379cc6790146105ef5781638456cb59146104e75781639010d07c146104a657816391d148541461046057816395d89b411461037b578163a217fddf14610360578163a457c2d7146102b8578163a9059cbb14610287578163ca15c8731461025f578163d539139314610224578163d547741f146101e257508063dd62ed3e1461019a5763e63ab1e91461016f57600080fd5b346101965781600319360112610196576020905160008051602061182f8339815191528152f35b5080fd5b5034610196578060031936011261019657806020926101b7610df6565b6101bf610e11565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b9190503461022057806003193601126102205761021d91356102186001610207610e11565b938387528660205286200154610e27565b611187565b80f35b8280fd5b505034610196578160031936011261019657602090517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b9050346102205760203660031901126102205760209282913581526001845220549051908152f35b5050346101965780600319360112610196576020906102b16102a7610df6565b6024359033611231565b5160018152f35b9050823461035d578260031936011261035d576102d3610df6565b918360243592338152600360205281812060018060a01b038616825260205220549082821061030c576020856102b185850387336113f1565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b80fd5b50503461019657816003193601126101965751908152602090f35b91905034610220578260031936011261022057805191836006549060019082821c928281168015610456575b6020958686108214610443575084885290811561042157506001146103e6575b6103e286866103d8828b038361114f565b5191829182610dca565b0390f35b929550600683528583205b82841061040e57505050826103e2946103d89282010194386103c7565b80548685018801529286019281016103f1565b60ff191687860152505050151560051b83010192506103d8826103e2386103c7565b634e487b7160e01b845260229052602483fd5b93607f16936103a7565b9050346102205781600319360112610220578160209360ff92610481610e11565b903582528186528282206001600160a01b039091168252855220549151911615158152f35b9050346102205781600319360112610220576020926104d191358152600184528260243591206116b5565b905491519160018060a01b039160031b1c168152f35b90503461022057826003193601126102205760008051602061182f83398151915283528260205281832033845260205260ff82842054161561059d576007549060ff8216610567575060ff1916600117600755513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a180f35b606490602084519162461bcd60e51b8352820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152fd5b6020608492519162461bcd60e51b83528201526039602482015260008051602061186f833981519152604482015278686176652070617573657220726f6c6520746f20706175736560381b6064820152fd5b5050346101965736600319011261035d5761021d61060b610df6565b6024359061061a8233836114f3565b61158b565b5050346101965760203660031901126101965760209181906001600160a01b03610647610df6565b1681526002845220549051908152f35b50503461019657816003193601126101965760209060ff6007541690519015158152f35b8390346101965760203660031901126101965761021d90353361158b565b919050346102205780600319360112610220576106b4610df6565b90602435907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68552602092858452818620338752845260ff8287205416156107de576001600160a01b031693841561079d5760ff6007541661074957918593918361072f8360008051602061184f833981519152965461120e565b90558585526002835280852082815401905551908152a380f35b83608492519162461bcd60e51b8352820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152fd5b83606492519162461bcd60e51b8352820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b815162461bcd60e51b81528086018590526038602482015260008051602061186f8339815191526044820152771a185d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60421b6064820152608490fd5b90503461022057826003193601126102205760008051602061182f83398151915283528260205281832033845260205260ff8284205416156108e8576007549060ff8216156108ae575060ff1916600755513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b6020608492519162461bcd60e51b8352820152603b602482015260008051602061186f83398151915260448201527f686176652070617573657220726f6c6520746f20756e706175736500000000006064820152fd5b5050346101965780600319360112610196576102b1602092610987610961610df6565b338352600386528483206001600160a01b0382168452865291849020546024359061120e565b90336113f1565b839150346101965782600319360112610196576109a9610e11565b90336001600160a01b038316036109c5579061021d9135611187565b608490602085519162461bcd60e51b8352820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152fd5b50503461019657816003193601126101965760209060ff60075460081c169051908152f35b91905034610220578060031936011261022057610aae9135906001610a68610e11565b92808652602090868252610a80838589200154610e27565b80875286825283872094838060a01b031694858852825260ff848820541615610ab2575b86525283206116cd565b5080f35b8087528682528387208588528252838720805460ff1916841790553385827f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8a80a4610aa4565b505034610196578160031936011261019657602090517f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8488152f35b90503461022057602036600319011261022057816020936001923581528085522001549051908152f35b505034610196576060366003190112610196576020906102b1610b7f610df6565b610b87610e11565b60443591610b968333836114f3565b611231565b905034610220578160031936011261022057610bb5610df6565b917f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84884528360205280842033855260205260ff818520541615610bff578361021d6024358561158b565b906020608492519162461bcd60e51b83528201526038602482015260008051602061186f8339815191526044820152773430bb3290313ab93732b9103937b632903a3790313ab93760411b6064820152fd5b90503461022057826003193601126102205760209250549051908152f35b5050346101965780600319360112610196576020906102b1610c8f610df6565b60243590336113f1565b91905034610220578260031936011261022057805191836005549060019082821c928281168015610d30575b602095868610821461044357508488529081156104215750600114610cf5576103e286866103d8828b038361114f565b929550600583528583205b828410610d1d57505050826103e2946103d89282010194386103c7565b8054868501880152928601928101610d00565b93607f1693610cc5565b849134610220576020366003190112610220573563ffffffff60e01b81168091036102205760209250635a05180f60e01b8114908115610d7c575b5015158152f35b637965db0b60e01b811491508115610d96575b5083610d75565b6301ffc9a760e01b14905083610d8f565b60005b838110610dba5750506000910152565b8181015183820152602001610daa565b60409160208252610dea8151809281602086015260208686019101610da7565b601f01601f1916010190565b600435906001600160a01b0382168203610e0c57565b600080fd5b602435906001600160a01b0382168203610e0c57565b6000818152602090808252604092838220338352835260ff848320541615610e4f5750505050565b835167ffffffffffffffff919033606082018481118382101761113b578752602a825285820192873685378251156111275760308453825191600192831015611113576078602185015360295b8381116110a9575061106757908751946080860190868210908211176110535788526042855286850195606036883785511561103f5760308753855182101561103f5790607860218701536041915b818311610fd157505050610f8f57938593610f7593610f66604894610f3d76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b99610f8b9b519a8b978801525180926037880190610da7565b8401917001034b99036b4b9b9b4b733903937b6329607d1b603784015251809386840190610da7565b0103602881018552018361114f565b5162461bcd60e51b815291829160048301610dca565b0390fd5b60648587519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f8116601081101561102b576f181899199a1a9b1b9c1cb0b131b232b360811b901a611001858961168e565b5360041c92801561101757600019019190610eeb565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b87526041600452602487fd5b60648789519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b90600f811660108110156110ff576f181899199a1a9b1b9c1cb0b131b232b360811b901a6110d7838761168e565b5360041c9080156110eb5760001901610e9c565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b87526032600452602487fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b86526041600452602486fd5b90601f8019910116810190811067ffffffffffffffff82111761117157604052565b634e487b7160e01b600052604160045260246000fd5b9060406111c492600090808252816020528282209360018060a01b03169384835260205260ff83832054166111c7575b8152600160205220611752565b50565b8082528160205282822084835260205282822060ff1981541690553384827ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8580a46111b7565b9190820180921161121b57565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0390811691821561139e571691821561134d5760ff600754166112f557600082815260026020526040812054918083106112a1576040828260008051602061184f83398151915295876020965260028652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6001600160a01b039081169182156114a257169182156114525760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260038252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b9060018060a01b038083166000526003602052604060002090821660005260205260406000205492600019840361152b575b50505050565b8084106115465761153d9303916113f1565b38808080611525565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b6001600160a01b0316801561163f5760ff600754166112f557806000526002602052604060002054918083106115ef5760208160008051602061184f83398151915292600095858752600284520360408620558060045403600455604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b90815181101561169f570160200190565b634e487b7160e01b600052603260045260246000fd5b805482101561169f5760005260206000200190600090565b9190600183016000908282528060205260408220541560001461174c57845494600160401b8610156117385783611728611711886001604098999a018555846116b5565b819391549060031b91821b91600019901b19161790565b9055549382526020522055600190565b634e487b7160e01b83526041600452602483fd5b50925050565b906001820190600092818452826020526040842054908115156000146118275760001991808301818111611813578254908482019182116110eb578082036117de575b505050805480156117ca578201916117ad83836116b5565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6117fe6117ee61171193866116b5565b90549060031b1c928392866116b5565b90558652846020526040862055388080611795565b634e487b7160e01b87526011600452602487fd5b505050509056fe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332304d696e7465724275726e6572446563696d616c733a206d75737420a2646970667358221220ce1ae6525e01655a7cc9c91e11284a74018763a1d850a7c67f6a12c52b68836964736f6c63430008140033", + "bytecode": "0x60806040523461046e57611aab8038038061001981610472565b92833981019060608183031261046e5780516001600160401b03811161046e5782610045918301610497565b60208201519092906001600160401b03811161046e57604091610069918401610497565b91015160ff8116810361046e5782516001600160401b03811161039c57600554600181811c91168015610464575b602082101461037e57601f811161041e575b506020601f82116001146103bb57819293945f926103b0575b50508160011b915f199060031b1c1916176005555b81516001600160401b03811161039c57600654600181811c91168015610392575b602082101461037e57601f811161031b575b50602092601f82116001146102ba57928192935f926102af575b50508160011b915f199060031b1c1916176006555b610142336104e8565b610277575b6101503361055e565b610232575b61015e336105de565b6101ed575b61016c3361065e565b610195575b61ff006007549160081b169061ff0019161760075560405161126990816107628239f35b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8485f5260016020526101e7337f4796a5437e25bdc491b74d328cf6b437c8587e216f52049c7df56421f51ae30f6106f1565b50610171565b5f80516020611a2b8339815191525f52600160205261022c337fb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a86106f1565b50610163565b5f80516020611a4b8339815191525f526001602052610271337f64e21244e91af723e1b962171ed4828dcecc0d7b89872e516a5db8266da800006106f1565b50610155565b5f805260016020526102a9337fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb496106f1565b50610147565b015190505f80610124565b601f1982169360065f52805f20915f5b86811061030357508360019596106102eb575b505050811b01600655610139565b01515f1960f88460031b161c191690555f80806102dd565b919260206001819286850151815501940192016102ca565b60065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f601f830160051c81019160208410610374575b601f0160051c01905b818110610369575061010a565b5f815560010161035c565b9091508190610353565b634e487b7160e01b5f52602260045260245ffd5b90607f16906100f8565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100c2565b601f1982169060055f52805f20915f5b818110610406575095836001959697106103ee575b505050811b016005556100d7565b01515f1960f88460031b161c191690555f80806103e0565b9192602060018192868b0151815501940192016103cb565b60055f5260205f20601f830160051c8101916020841061045a575b601f0160051c01905b81811061044f57506100a9565b5f8155600101610442565b9091508190610439565b90607f1690610097565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761039c57604052565b81601f8201121561046e578051906001600160401b03821161039c576104c6601f8301601f1916602001610472565b928284526020838301011161046e57815f9260208093018386015e8301015290565b6001600160a01b0381165f9081525f80516020611a8b833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611a8b83398151915260205260408120805460ff191660011790553391905f805160206119cb8339815191528180a4600190565b505f90565b6001600160a01b0381165f9081525f805160206119eb833981519152602052604090205460ff16610559576001600160a01b03165f8181525f805160206119eb83398151915260205260408120805460ff191660011790553391905f80516020611a4b833981519152905f805160206119cb8339815191529080a4600190565b6001600160a01b0381165f9081525f80516020611a0b833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611a0b83398151915260205260408120805460ff191660011790553391905f80516020611a2b833981519152905f805160206119cb8339815191529080a4600190565b6001600160a01b0381165f9081525f80516020611a6b833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611a6b83398151915260205260408120805460ff191660011790553391907f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848905f805160206119cb8339815191529080a4600190565b6001810190825f528160205260405f2054155f1461075a5780546801000000000000000081101561039c5760018101808355811015610746578390825f5260205f20015554915f5260205260405f2055600190565b634e487b7160e01b5f52603260045260245ffd5b5050505f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610c4d5750806306fdde0314610b92578063095ea7b314610aea57806318160ddd14610acd5780631cf2c7e214610a1e57806323b872dd146109e6578063248a9ca3146109b4578063282c51f31461097a5780632f2ff15d14610915578063313ce567146108f257806336568abe146108ae5780633f4ba83a146107c257806340c10f191461069e57806342966c68146106815780635c975abb1461065f57806370a082311461062757806379cc6790146105f75780638456cb591461051c5780639010d07c146104d757806391d148541461048f57806395d89b411461038b578063a217fddf14610371578063a3246ad3146102c2578063a9059cbb14610291578063ca15c87314610267578063d53913931461022d578063d547741f146101e9578063dd62ed3e146101995763e63ab1e91461015b575f80fd5b34610195575f3660031901126101955760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5f80fd5b34610195576040366003190112610195576101b2610ce4565b6101ba610cfa565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b346101955760403660031901126101955761022b600435610208610cfa565b90610226610221825f525f602052600160405f20015490565b610f06565b610f3e565b005b34610195575f3660031901126101955760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b34610195576020366003190112610195576004355f526001602052602060405f2054604051908152f35b34610195576040366003190112610195576102b76102ad610ce4565b6024359033610e77565b602060405160018152f35b34610195576020366003190112610195576004355f52600160205260405f20604051806020835491828152019081935f5260205f20905f5b81811061035b5750505081610310910382610d10565b604051918291602083019060208452518091526040830191905f5b818110610339575050500390f35b82516001600160a01b031684528594506020938401939092019160010161032b565b82548452602090930192600192830192016102fa565b34610195575f3660031901126101955760206040515f8152f35b34610195575f366003190112610195576040515f6006548060011c90600181168015610485575b6020831081146104715782855290811561044d57506001146103ef575b6103eb836103df81850382610d10565b60405191829182610cba565b0390f35b60065f9081527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939250905b808210610433575090915081016020016103df6103cf565b91926001816020925483858801015201910190929161041b565b60ff191660208086019190915291151560051b840190910191506103df90506103cf565b634e487b7160e01b5f52602260045260245ffd5b91607f16916103b2565b34610195576040366003190112610195576104a8610cfa565b6004355f525f60205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b34610195576040366003190112610195576004355f526001602052602061050360243560405f2061109b565b905460405160039290921b1c6001600160a01b03168152f35b34610195575f36600319011261019557335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156105a35761056a611080565b600160ff1960075416176007557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b60405162461bcd60e51b815260206004820152603960248201525f80516020611214833981519152604482015278686176652070617573657220726f6c6520746f20706175736560381b6064820152608490fd5b346101955760403660031901126101955761022b610613610ce4565b60243590610622823383610dd4565b610d46565b34610195576020366003190112610195576001600160a01b03610648610ce4565b165f526002602052602060405f2054604051908152f35b34610195575f36600319011261019557602060ff600754166040519015158152f35b346101955760203660031901126101955761022b60043533610d46565b34610195576040366003190112610195576106b7610ce4565b335f9081527f0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c6020526040902054602435919060ff161561076f576001600160a01b031690811561075c5761070a611080565b600454908082018092116107485760205f805160206111f4833981519152915f936004558484526002825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152603860248201525f805160206112148339815191526044820152771a185d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60421b6064820152608490fd5b34610195575f36600319011261019557335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156108565760075460ff8116156108475760ff19166007557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152603b60248201525f8051602061121483398151915260448201527f686176652070617573657220726f6c6520746f20756e706175736500000000006064820152608490fd5b34610195576040366003190112610195576108c7610cfa565b336001600160a01b038216036108e35761022b90600435610f3e565b63334bd91960e11b5f5260045ffd5b34610195575f36600319011261019557602060ff60075460081c16604051908152f35b3461019557604036600319011261019557600435610931610cfa565b610949610221835f525f602052600160405f20015490565b6109538183610f78565b61095957005b5f9182526001602052604090912061022b916001600160a01b0316906110c4565b34610195575f3660031901126101955760206040517f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8488152f35b346101955760203660031901126101955760206109de6004355f525f602052600160405f20015490565b604051908152f35b34610195576060366003190112610195576102b7610a02610ce4565b610a0a610cfa565b60443591610a19833383610dd4565b610e77565b3461019557604036600319011261019557610a37610ce4565b335f9081527f6bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870ae602052604090205460ff1615610a7a5761022b9060243590610d46565b60405162461bcd60e51b815260206004820152603860248201525f805160206112148339815191526044820152773430bb3290313ab93732b9103937b632903a3790313ab93760411b6064820152608490fd5b34610195575f366003190112610195576020600454604051908152f35b3461019557604036600319011261019557610b03610ce4565b602435903315610b7f576001600160a01b0316908115610b6c57335f52600360205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b34610195575f366003190112610195576040515f6005548060011c90600181168015610c43575b6020831081146104715782855290811561044d5750600114610be5576103eb836103df81850382610d10565b60055f9081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0939250905b808210610c29575090915081016020016103df6103cf565b919260018160209254838588010152019101909291610c11565b91607f1691610bb9565b34610195576020366003190112610195576004359063ffffffff60e01b821680920361019557602091635a05180f60e01b8114908115610c8f575b5015158152f35b637965db0b60e01b811491508115610ca9575b5083610c88565b6301ffc9a760e01b14905083610ca2565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361019557565b602435906001600160a01b038216820361019557565b90601f8019910116810190811067ffffffffffffffff821117610d3257604052565b634e487b7160e01b5f52604160045260245ffd5b9091906001600160a01b03168015610dc157610d60611080565b805f52600260205260405f2054838110610da7576020845f94955f805160206111f483398151915293858752600284520360408620558060045403600455604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b634b637e8f60e11b5f525f60045260245ffd5b6001600160a01b039081165f818152600360209081526040808320948616835293905291909120549291905f198410610e0e575b50505050565b828410610e54578015610b7f576001600160a01b03821615610b6c575f52600360205260405f209060018060a01b03165f5260205260405f20910390555f808080610e08565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115610dc1576001600160a01b031691821561075c57610e9f611080565b815f52600260205260405f2054818110610eed57815f805160206111f483398151915292602092855f52600284520360405f2055845f526002825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b5f8181526020818152604080832033845290915290205460ff1615610f285750565b63e2517d3f60e01b5f523360045260245260445ffd5b610f488282611000565b9182610f5357505090565b5f91825260016020526040909120610f74916001600160a01b03169061112e565b5090565b5f818152602081815260408083206001600160a01b038616845290915290205460ff16610ffa575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615610ffa575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b60ff6007541661108c57565b63d93c066560e01b5f5260045ffd5b80548210156110b0575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6001810190825f528160205260405f2054155f14611127578054600160401b811015610d32576111146110fe82600187940185558461109b565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b906001820191815f528260205260405f20548015155f146111eb575f1981018181116107485782545f19810191908211610748578181036111b6575b505050805480156111a2575f190190611183828261109b565b8154905f199060031b1b19169055555f526020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b6111d66111c66110fe938661109b565b90549060031b1c9283928661109b565b90555f528360205260405f20555f808061116a565b505050505f9056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332304d696e7465724275726e6572446563696d616c733a206d75737420a2646970667358221220ea92aed80f7a1d841f88e290f91f7566eb54bcd1aa7588c3fc28153b7458e97764736f6c634300081a00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6cf7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870aead3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610c4d5750806306fdde0314610b92578063095ea7b314610aea57806318160ddd14610acd5780631cf2c7e214610a1e57806323b872dd146109e6578063248a9ca3146109b4578063282c51f31461097a5780632f2ff15d14610915578063313ce567146108f257806336568abe146108ae5780633f4ba83a146107c257806340c10f191461069e57806342966c68146106815780635c975abb1461065f57806370a082311461062757806379cc6790146105f75780638456cb591461051c5780639010d07c146104d757806391d148541461048f57806395d89b411461038b578063a217fddf14610371578063a3246ad3146102c2578063a9059cbb14610291578063ca15c87314610267578063d53913931461022d578063d547741f146101e9578063dd62ed3e146101995763e63ab1e91461015b575f80fd5b34610195575f3660031901126101955760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5f80fd5b34610195576040366003190112610195576101b2610ce4565b6101ba610cfa565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b346101955760403660031901126101955761022b600435610208610cfa565b90610226610221825f525f602052600160405f20015490565b610f06565b610f3e565b005b34610195575f3660031901126101955760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b34610195576020366003190112610195576004355f526001602052602060405f2054604051908152f35b34610195576040366003190112610195576102b76102ad610ce4565b6024359033610e77565b602060405160018152f35b34610195576020366003190112610195576004355f52600160205260405f20604051806020835491828152019081935f5260205f20905f5b81811061035b5750505081610310910382610d10565b604051918291602083019060208452518091526040830191905f5b818110610339575050500390f35b82516001600160a01b031684528594506020938401939092019160010161032b565b82548452602090930192600192830192016102fa565b34610195575f3660031901126101955760206040515f8152f35b34610195575f366003190112610195576040515f6006548060011c90600181168015610485575b6020831081146104715782855290811561044d57506001146103ef575b6103eb836103df81850382610d10565b60405191829182610cba565b0390f35b60065f9081527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939250905b808210610433575090915081016020016103df6103cf565b91926001816020925483858801015201910190929161041b565b60ff191660208086019190915291151560051b840190910191506103df90506103cf565b634e487b7160e01b5f52602260045260245ffd5b91607f16916103b2565b34610195576040366003190112610195576104a8610cfa565b6004355f525f60205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b34610195576040366003190112610195576004355f526001602052602061050360243560405f2061109b565b905460405160039290921b1c6001600160a01b03168152f35b34610195575f36600319011261019557335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156105a35761056a611080565b600160ff1960075416176007557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b60405162461bcd60e51b815260206004820152603960248201525f80516020611214833981519152604482015278686176652070617573657220726f6c6520746f20706175736560381b6064820152608490fd5b346101955760403660031901126101955761022b610613610ce4565b60243590610622823383610dd4565b610d46565b34610195576020366003190112610195576001600160a01b03610648610ce4565b165f526002602052602060405f2054604051908152f35b34610195575f36600319011261019557602060ff600754166040519015158152f35b346101955760203660031901126101955761022b60043533610d46565b34610195576040366003190112610195576106b7610ce4565b335f9081527f0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c6020526040902054602435919060ff161561076f576001600160a01b031690811561075c5761070a611080565b600454908082018092116107485760205f805160206111f4833981519152915f936004558484526002825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152603860248201525f805160206112148339815191526044820152771a185d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60421b6064820152608490fd5b34610195575f36600319011261019557335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156108565760075460ff8116156108475760ff19166007557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152603b60248201525f8051602061121483398151915260448201527f686176652070617573657220726f6c6520746f20756e706175736500000000006064820152608490fd5b34610195576040366003190112610195576108c7610cfa565b336001600160a01b038216036108e35761022b90600435610f3e565b63334bd91960e11b5f5260045ffd5b34610195575f36600319011261019557602060ff60075460081c16604051908152f35b3461019557604036600319011261019557600435610931610cfa565b610949610221835f525f602052600160405f20015490565b6109538183610f78565b61095957005b5f9182526001602052604090912061022b916001600160a01b0316906110c4565b34610195575f3660031901126101955760206040517f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8488152f35b346101955760203660031901126101955760206109de6004355f525f602052600160405f20015490565b604051908152f35b34610195576060366003190112610195576102b7610a02610ce4565b610a0a610cfa565b60443591610a19833383610dd4565b610e77565b3461019557604036600319011261019557610a37610ce4565b335f9081527f6bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870ae602052604090205460ff1615610a7a5761022b9060243590610d46565b60405162461bcd60e51b815260206004820152603860248201525f805160206112148339815191526044820152773430bb3290313ab93732b9103937b632903a3790313ab93760411b6064820152608490fd5b34610195575f366003190112610195576020600454604051908152f35b3461019557604036600319011261019557610b03610ce4565b602435903315610b7f576001600160a01b0316908115610b6c57335f52600360205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b34610195575f366003190112610195576040515f6005548060011c90600181168015610c43575b6020831081146104715782855290811561044d5750600114610be5576103eb836103df81850382610d10565b60055f9081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0939250905b808210610c29575090915081016020016103df6103cf565b919260018160209254838588010152019101909291610c11565b91607f1691610bb9565b34610195576020366003190112610195576004359063ffffffff60e01b821680920361019557602091635a05180f60e01b8114908115610c8f575b5015158152f35b637965db0b60e01b811491508115610ca9575b5083610c88565b6301ffc9a760e01b14905083610ca2565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361019557565b602435906001600160a01b038216820361019557565b90601f8019910116810190811067ffffffffffffffff821117610d3257604052565b634e487b7160e01b5f52604160045260245ffd5b9091906001600160a01b03168015610dc157610d60611080565b805f52600260205260405f2054838110610da7576020845f94955f805160206111f483398151915293858752600284520360408620558060045403600455604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b634b637e8f60e11b5f525f60045260245ffd5b6001600160a01b039081165f818152600360209081526040808320948616835293905291909120549291905f198410610e0e575b50505050565b828410610e54578015610b7f576001600160a01b03821615610b6c575f52600360205260405f209060018060a01b03165f5260205260405f20910390555f808080610e08565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115610dc1576001600160a01b031691821561075c57610e9f611080565b815f52600260205260405f2054818110610eed57815f805160206111f483398151915292602092855f52600284520360405f2055845f526002825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b5f8181526020818152604080832033845290915290205460ff1615610f285750565b63e2517d3f60e01b5f523360045260245260445ffd5b610f488282611000565b9182610f5357505090565b5f91825260016020526040909120610f74916001600160a01b03169061112e565b5090565b5f818152602081815260408083206001600160a01b038616845290915290205460ff16610ffa575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615610ffa575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b60ff6007541661108c57565b63d93c066560e01b5f5260045ffd5b80548210156110b0575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6001810190825f528160205260405f2054155f14611127578054600160401b811015610d32576111146110fe82600187940185558461109b565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b906001820191815f528260205260405f20548015155f146111eb575f1981018181116107485782545f19810191908211610748578181036111b6575b505050805480156111a2575f190190611183828261109b565b8154905f199060031b1b19169055555f526020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b6111d66111c66110fe938661109b565b90549060031b1c9283928661109b565b90555f528360205260405f20555f808061116a565b505050505f9056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332304d696e7465724275726e6572446563696d616c733a206d75737420a2646970667358221220ea92aed80f7a1d841f88e290f91f7566eb54bcd1aa7588c3fc28153b7458e97764736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/ERC20MinterBurnerDecimals.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/contracts/solidity/ERC20MinterBurnerDecimals.sol b/contracts/solidity/ERC20MinterBurnerDecimals.sol index 613d1055a..84121f032 100644 --- a/contracts/solidity/ERC20MinterBurnerDecimals.sol +++ b/contracts/solidity/ERC20MinterBurnerDecimals.sol @@ -6,7 +6,7 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol"; -import "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; +import "@openzeppelin/contracts/access/extensions/AccessControlEnumerable.sol"; import "@openzeppelin/contracts/utils/Context.sol"; /** @@ -37,11 +37,11 @@ contract ERC20MinterBurnerDecimals is Context, AccessControlEnumerable, ERC20Bur */ constructor(string memory name, string memory symbol, uint8 decimals_) ERC20(name, symbol) { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); - _setupRole(MINTER_ROLE, _msgSender()); - _setupRole(PAUSER_ROLE, _msgSender()); - _setupRole(BURNER_ROLE, _msgSender()); + _grantRole(MINTER_ROLE, _msgSender()); + _grantRole(PAUSER_ROLE, _msgSender()); + _grantRole(BURNER_ROLE, _msgSender()); _setupDecimals(decimals_); } @@ -115,11 +115,7 @@ contract ERC20MinterBurnerDecimals is Context, AccessControlEnumerable, ERC20Bur _unpause(); } - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override(ERC20, ERC20Pausable) { - super._beforeTokenTransfer(from, to, amount); + function _update(address from, address to, uint256 value) internal virtual override(ERC20, ERC20Pausable) { + super._update(from, to, value); } } \ No newline at end of file diff --git a/contracts/solidity/ERC20RecursiveNonRevertingPrecompileCall.json b/contracts/solidity/ERC20RecursiveNonRevertingPrecompileCall.json index 6e660def9..666394fcb 100644 --- a/contracts/solidity/ERC20RecursiveNonRevertingPrecompileCall.json +++ b/contracts/solidity/ERC20RecursiveNonRevertingPrecompileCall.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "ERC20RecursiveNonRevertingPrecompileCall", "sourceName": "solidity/ERC20RecursiveNonRevertingPrecompileCall.sol", "abi": [ @@ -24,6 +24,123 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -285,7 +402,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -323,7 +440,7 @@ "inputs": [ { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -359,7 +476,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -388,30 +505,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -498,16 +591,17 @@ "internalType": "bytes32", "name": "role", "type": "bytes32" - }, + } + ], + "name": "getRoleMembers", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "address[]", + "name": "", + "type": "address[]" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -523,31 +617,25 @@ "type": "address" } ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "increaseAllowance", + "name": "hasRole", "outputs": [ { "internalType": "bool", @@ -555,7 +643,7 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -618,7 +706,7 @@ }, { "internalType": "address", - "name": "account", + "name": "callerConfirmation", "type": "address" } ], @@ -699,7 +787,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -728,7 +816,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -751,8 +839,11 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b50604051620041d1380380620041d18339818101604052810190620000379190620005e0565b828281600590816200004a9190620008c5565b5080600690816200005c9190620008c5565b5050506000600760006101000a81548160ff0219169083151502179055506200009e6000801b620000926200017b60201b60201c565b6200018360201b60201c565b620000df7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000d36200017b60201b60201c565b6200018360201b60201c565b620001207f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001146200017b60201b60201c565b6200018360201b60201c565b620001617f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848620001556200017b60201b60201c565b6200018360201b60201c565b6200017281620001c160201b60201c565b505050620009ac565b600033905090565b620001958282620001df60201b60201c565b620001bc8160016000858152602001908152602001600020620002d060201b90919060201c565b505050565b80600760016101000a81548160ff021916908360ff16021790555050565b620001f182826200030860201b60201c565b620002cc57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002716200017b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000300836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200037260201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620003868383620003ec60201b60201c565b620003e1578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620003e6565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000478826200042d565b810181811067ffffffffffffffff821117156200049a57620004996200043e565b5b80604052505050565b6000620004af6200040f565b9050620004bd82826200046d565b919050565b600067ffffffffffffffff821115620004e057620004df6200043e565b5b620004eb826200042d565b9050602081019050919050565b60005b8381101562000518578082015181840152602081019050620004fb565b60008484015250505050565b60006200053b6200053584620004c2565b620004a3565b9050828152602081018484840111156200055a576200055962000428565b5b62000567848285620004f8565b509392505050565b600082601f83011262000587576200058662000423565b5b81516200059984826020860162000524565b91505092915050565b600060ff82169050919050565b620005ba81620005a2565b8114620005c657600080fd5b50565b600081519050620005da81620005af565b92915050565b600080600060608486031215620005fc57620005fb62000419565b5b600084015167ffffffffffffffff8111156200061d576200061c6200041e565b5b6200062b868287016200056f565b935050602084015167ffffffffffffffff8111156200064f576200064e6200041e565b5b6200065d868287016200056f565b92505060406200067086828701620005c9565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006cd57607f821691505b602082108103620006e357620006e262000685565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200074d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200070e565b6200075986836200070e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007a6620007a06200079a8462000771565b6200077b565b62000771565b9050919050565b6000819050919050565b620007c28362000785565b620007da620007d182620007ad565b8484546200071b565b825550505050565b600090565b620007f1620007e2565b620007fe818484620007b7565b505050565b5b8181101562000826576200081a600082620007e7565b60018101905062000804565b5050565b601f82111562000875576200083f81620006e9565b6200084a84620006fe565b810160208510156200085a578190505b620008726200086985620006fe565b83018262000803565b50505b505050565b600082821c905092915050565b60006200089a600019846008026200087a565b1980831691505092915050565b6000620008b5838362000887565b9150826002028217905092915050565b620008d0826200067a565b67ffffffffffffffff811115620008ec57620008eb6200043e565b5b620008f88254620006b4565b620009058282856200082a565b600060209050601f8311600181146200093d576000841562000928578287015190505b620009348582620008a7565b865550620009a4565b601f1984166200094d86620006e9565b60005b82811015620009775784890151825560018201915060208501945060208101905062000950565b8683101562000997578489015162000993601f89168262000887565b8355505b6001600288020188555050505b505050505050565b61381580620009bc6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806342966c681161010f578063a217fddf116100a2578063d539139311610071578063d5391393146105b9578063d547741f146105d7578063dd62ed3e146105f3578063e63ab1e914610623576101f0565b8063a217fddf1461050b578063a457c2d714610529578063a9059cbb14610559578063ca15c87314610589576101f0565b80638456cb59116100de5780638456cb59146104835780639010d07c1461048d57806391d14854146104bd57806395d89b41146104ed576101f0565b806342966c68146103fd5780635c975abb1461041957806370a082311461043757806379cc679014610467576101f0565b8063282c51f311610187578063372500ab11610156578063372500ab1461039d57806339509351146103a75780633f4ba83a146103d757806340c10f19146103e1576101f0565b8063282c51f3146103295780632f2ff15d14610347578063313ce5671461036357806336568abe14610381576101f0565b806318160ddd116101c357806318160ddd1461028f5780631cf2c7e2146102ad57806323b872dd146102c9578063248a9ca3146102f9576101f0565b806301ffc9a7146101f557806303f24de11461022557806306fdde0314610241578063095ea7b31461025f575b600080fd5b61020f600480360381019061020a91906122fa565b610641565b60405161021c9190612342565b60405180910390f35b61023f600480360381019061023a91906124d9565b6106bb565b005b610249610786565b60405161025691906125b4565b60405180910390f35b61027960048036038101906102749190612634565b610818565b6040516102869190612342565b60405180910390f35b61029761083b565b6040516102a49190612683565b60405180910390f35b6102c760048036038101906102c29190612634565b610845565b005b6102e360048036038101906102de919061269e565b6108c3565b6040516102f09190612342565b60405180910390f35b610313600480360381019061030e9190612727565b6108f2565b6040516103209190612763565b60405180910390f35b610331610911565b60405161033e9190612763565b60405180910390f35b610361600480360381019061035c919061277e565b610935565b005b61036b610956565b60405161037891906127da565b60405180910390f35b61039b6004803603810190610396919061277e565b61096d565b005b6103a56109f0565b005b6103c160048036038101906103bc9190612634565b610a74565b6040516103ce9190612342565b60405180910390f35b6103df610aab565b005b6103fb60048036038101906103f69190612634565b610b25565b005b610417600480360381019061041291906127f5565b610ba3565b005b610421610bb7565b60405161042e9190612342565b60405180910390f35b610451600480360381019061044c9190612822565b610bce565b60405161045e9190612683565b60405180910390f35b610481600480360381019061047c9190612634565b610c17565b005b61048b610c37565b005b6104a760048036038101906104a2919061284f565b610cb1565b6040516104b4919061289e565b60405180910390f35b6104d760048036038101906104d2919061277e565b610ce0565b6040516104e49190612342565b60405180910390f35b6104f5610d4a565b60405161050291906125b4565b60405180910390f35b610513610ddc565b6040516105209190612763565b60405180910390f35b610543600480360381019061053e9190612634565b610de3565b6040516105509190612342565b60405180910390f35b610573600480360381019061056e9190612634565b610e5a565b6040516105809190612342565b60405180910390f35b6105a3600480360381019061059e9190612727565b610e7d565b6040516105b09190612683565b60405180910390f35b6105c1610ea1565b6040516105ce9190612763565b60405180910390f35b6105f160048036038101906105ec919061277e565b610ec5565b005b61060d600480360381019061060891906128b9565b610ee6565b60405161061a9190612683565b60405180910390f35b61062b610f6d565b6040516106389190612763565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b457506106b382610f91565b5b9050919050565b600061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b81526004016106fc939291906128f9565b6020604051808303816000875af115801561071b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073f9190612963565b905080610781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610778906129dc565b60405180910390fd5b505050565b60606005805461079590612a2b565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190612a2b565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905090565b60008061082361100b565b9050610830818585611013565b600191505092915050565b6000600454905090565b6108767f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84861087161100b565b610ce0565b6108b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ac90612ace565b60405180910390fd5b6108bf82826111dc565b5050565b6000806108ce61100b565b90506108db8582856113ab565b6108e6858585611437565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61093e826108f2565b610947816116b0565b61095183836116c4565b505050565b6000600760019054906101000a900460ff16905090565b61097561100b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d990612b60565b60405180910390fd5b6109ec82826116f8565b5050565b61080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f3060646040518363ffffffff1660e01b8152600401610a2e929190612bd5565b6020604051808303816000875af1158015610a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a719190612963565b50565b600080610a7f61100b565b9050610aa0818585610a918589610ee6565b610a9b9190612c2d565b611013565b600191505092915050565b610adc7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ad761100b565b610ce0565b610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1290612cd3565b60405180910390fd5b610b2361172c565b565b610b567f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610b5161100b565b610ce0565b610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90612d65565b60405180910390fd5b610b9f828261178f565b5050565b610bb4610bae61100b565b826111dc565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c2982610c2361100b565b836113ab565b610c3382826111dc565b5050565b610c687f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c6361100b565b610ce0565b610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90612df7565b60405180910390fd5b610caf6118e6565b565b6000610cd8826001600086815260200190815260200160002061194990919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610d5990612a2b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8590612a2b565b8015610dd25780601f10610da757610100808354040283529160200191610dd2565b820191906000526020600020905b815481529060010190602001808311610db557829003601f168201915b5050505050905090565b6000801b81565b600080610dee61100b565b90506000610dfc8286610ee6565b905083811015610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3890612e89565b60405180910390fd5b610e4e8286868403611013565b60019250505092915050565b600080610e6561100b565b9050610e72818585611437565b600191505092915050565b6000610e9a60016000848152602001908152602001600020611963565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610ece826108f2565b610ed7816116b0565b610ee183836116f8565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611004575061100382611978565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107990612f1b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890612fad565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111cf9190612683565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361124b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112429061303f565b60405180910390fd5b611257826000836119e2565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d5906130d1565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113929190612683565b60405180910390a36113a683600084611aa7565b505050565b60006113b78484610ee6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114315781811015611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a9061313d565b60405180910390fd5b6114308484848403611013565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d906131cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c90613261565b60405180910390fd5b6115208383836119e2565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e906132f3565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116979190612683565b60405180910390a36116aa848484611aa7565b50505050565b6116c1816116bc61100b565b611aac565b50565b6116ce8282611b31565b6116f38160016000858152602001908152602001600020611c1190919063ffffffff16565b505050565b6117028282611c41565b6117278160016000858152602001908152602001600020611d2290919063ffffffff16565b505050565b611734611d52565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61177861100b565b604051611785919061289e565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f59061335f565b60405180910390fd5b61180a600083836119e2565b806004600082825461181c9190612c2d565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118ce9190612683565b60405180910390a36118e260008383611aa7565b5050565b6118ee611d9b565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861193261100b565b60405161193f919061289e565b60405180910390a1565b60006119588360000183611de5565b60001c905092915050565b600061197182600001611e10565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b7f6a7461657441bf111caa502b48bec73847d91c1265dc315d914c2d2a6c95fcfe838383604051611a159392919061337f565b60405180910390a160005b6005811015611a96573073ffffffffffffffffffffffffffffffffffffffff1663372500ab6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a7157600080fd5b505af1925050508015611a82575060015b508080611a8e906133b6565b915050611a20565b50611aa2838383611e21565b505050565b505050565b611ab68282610ce0565b611b2d57611ac381611e79565b611ad18360001c6020611ea6565b604051602001611ae29291906134d2565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2491906125b4565b60405180910390fd5b5050565b611b3b8282610ce0565b611c0d57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bb261100b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611c39836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6120e2565b905092915050565b611c4b8282610ce0565b15611d1e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611cc361100b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611d4a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612152565b905092915050565b611d5a610bb7565b611d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9090613558565b60405180910390fd5b565b611da3610bb7565b15611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda906135c4565b60405180910390fd5b565b6000826000018281548110611dfd57611dfc6135e4565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611e2c838383612266565b611e34610bb7565b15611e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6b90613685565b60405180910390fd5b505050565b6060611e9f8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611ea6565b9050919050565b606060006002836002611eb991906136a5565b611ec39190612c2d565b67ffffffffffffffff811115611edc57611edb612378565b5b6040519080825280601f01601f191660200182016040528015611f0e5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611f4657611f456135e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611faa57611fa96135e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611fea91906136a5565b611ff49190612c2d565b90505b6001811115612094577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612036576120356135e4565b5b1a60f81b82828151811061204d5761204c6135e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061208d906136e7565b9050611ff7565b50600084146120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf9061375c565b60405180910390fd5b8091505092915050565b60006120ee838361226b565b61214757826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061214c565b600090505b92915050565b6000808360010160008481526020019081526020016000205490506000811461225a576000600182612184919061377c565b905060006001866000018054905061219c919061377c565b905081811461220b5760008660000182815481106121bd576121bc6135e4565b5b90600052602060002001549050808760000184815481106121e1576121e06135e4565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061221f5761221e6137b0565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612260565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122d7816122a2565b81146122e257600080fd5b50565b6000813590506122f4816122ce565b92915050565b6000602082840312156123105761230f612298565b5b600061231e848285016122e5565b91505092915050565b60008115159050919050565b61233c81612327565b82525050565b60006020820190506123576000830184612333565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123b082612367565b810181811067ffffffffffffffff821117156123cf576123ce612378565b5b80604052505050565b60006123e261228e565b90506123ee82826123a7565b919050565b600067ffffffffffffffff82111561240e5761240d612378565b5b61241782612367565b9050602081019050919050565b82818337600083830152505050565b6000612446612441846123f3565b6123d8565b90508281526020810184848401111561246257612461612362565b5b61246d848285612424565b509392505050565b600082601f83011261248a5761248961235d565b5b813561249a848260208601612433565b91505092915050565b6000819050919050565b6124b6816124a3565b81146124c157600080fd5b50565b6000813590506124d3816124ad565b92915050565b600080604083850312156124f0576124ef612298565b5b600083013567ffffffffffffffff81111561250e5761250d61229d565b5b61251a85828601612475565b925050602061252b858286016124c4565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561256f578082015181840152602081019050612554565b60008484015250505050565b600061258682612535565b6125908185612540565b93506125a0818560208601612551565b6125a981612367565b840191505092915050565b600060208201905081810360008301526125ce818461257b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612601826125d6565b9050919050565b612611816125f6565b811461261c57600080fd5b50565b60008135905061262e81612608565b92915050565b6000806040838503121561264b5761264a612298565b5b60006126598582860161261f565b925050602061266a858286016124c4565b9150509250929050565b61267d816124a3565b82525050565b60006020820190506126986000830184612674565b92915050565b6000806000606084860312156126b7576126b6612298565b5b60006126c58682870161261f565b93505060206126d68682870161261f565b92505060406126e7868287016124c4565b9150509250925092565b6000819050919050565b612704816126f1565b811461270f57600080fd5b50565b600081359050612721816126fb565b92915050565b60006020828403121561273d5761273c612298565b5b600061274b84828501612712565b91505092915050565b61275d816126f1565b82525050565b60006020820190506127786000830184612754565b92915050565b6000806040838503121561279557612794612298565b5b60006127a385828601612712565b92505060206127b48582860161261f565b9150509250929050565b600060ff82169050919050565b6127d4816127be565b82525050565b60006020820190506127ef60008301846127cb565b92915050565b60006020828403121561280b5761280a612298565b5b6000612819848285016124c4565b91505092915050565b60006020828403121561283857612837612298565b5b60006128468482850161261f565b91505092915050565b6000806040838503121561286657612865612298565b5b600061287485828601612712565b9250506020612885858286016124c4565b9150509250929050565b612898816125f6565b82525050565b60006020820190506128b3600083018461288f565b92915050565b600080604083850312156128d0576128cf612298565b5b60006128de8582860161261f565b92505060206128ef8582860161261f565b9150509250929050565b600060608201905061290e600083018661288f565b8181036020830152612920818561257b565b905061292f6040830184612674565b949350505050565b61294081612327565b811461294b57600080fd5b50565b60008151905061295d81612937565b92915050565b60006020828403121561297957612978612298565b5b60006129878482850161294e565b91505092915050565b7f6661696c656420746f207374616b650000000000000000000000000000000000600082015250565b60006129c6600f83612540565b91506129d182612990565b602082019050919050565b600060208201905081810360008301526129f5816129b9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a4357607f821691505b602082108103612a5657612a556129fc565b5b50919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206275726e657220726f6c6520746f206275726e0000000000000000602082015250565b6000612ab8603883612540565b9150612ac382612a5c565b604082019050919050565b60006020820190508181036000830152612ae781612aab565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612b4a602f83612540565b9150612b5582612aee565b604082019050919050565b60006020820190508181036000830152612b7981612b3d565b9050919050565b6000819050919050565b600063ffffffff82169050919050565b6000819050919050565b6000612bbf612bba612bb584612b80565b612b9a565b612b8a565b9050919050565b612bcf81612ba4565b82525050565b6000604082019050612bea600083018561288f565b612bf76020830184612bc6565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c38826124a3565b9150612c43836124a3565b9250828201905080821115612c5b57612c5a612bfe565b5b92915050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b6000612cbd603b83612540565b9150612cc882612c61565b604082019050919050565b60006020820190508181036000830152612cec81612cb0565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b6000612d4f603883612540565b9150612d5a82612cf3565b604082019050919050565b60006020820190508181036000830152612d7e81612d42565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b6000612de1603983612540565b9150612dec82612d85565b604082019050919050565b60006020820190508181036000830152612e1081612dd4565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e73602583612540565b9150612e7e82612e17565b604082019050919050565b60006020820190508181036000830152612ea281612e66565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612f05602483612540565b9150612f1082612ea9565b604082019050919050565b60006020820190508181036000830152612f3481612ef8565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f97602283612540565b9150612fa282612f3b565b604082019050919050565b60006020820190508181036000830152612fc681612f8a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613029602183612540565b915061303482612fcd565b604082019050919050565b600060208201905081810360008301526130588161301c565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006130bb602283612540565b91506130c68261305f565b604082019050919050565b600060208201905081810360008301526130ea816130ae565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613127601d83612540565b9150613132826130f1565b602082019050919050565b600060208201905081810360008301526131568161311a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006131b9602583612540565b91506131c48261315d565b604082019050919050565b600060208201905081810360008301526131e8816131ac565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061324b602383612540565b9150613256826131ef565b604082019050919050565b6000602082019050818103600083015261327a8161323e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006132dd602683612540565b91506132e882613281565b604082019050919050565b6000602082019050818103600083015261330c816132d0565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613349601f83612540565b915061335482613313565b602082019050919050565b600060208201905081810360008301526133788161333c565b9050919050565b6000606082019050613394600083018661288f565b6133a1602083018561288f565b6133ae6040830184612674565b949350505050565b60006133c1826124a3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133f3576133f2612bfe565b5b600182019050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061343f6017836133fe565b915061344a82613409565b601782019050919050565b600061346082612535565b61346a81856133fe565b935061347a818560208601612551565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006134bc6011836133fe565b91506134c782613486565b601182019050919050565b60006134dd82613432565b91506134e98285613455565b91506134f4826134af565b91506135008284613455565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613542601483612540565b915061354d8261350c565b602082019050919050565b6000602082019050818103600083015261357181613535565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006135ae601083612540565b91506135b982613578565b602082019050919050565b600060208201905081810360008301526135dd816135a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600061366f602a83612540565b915061367a82613613565b604082019050919050565b6000602082019050818103600083015261369e81613662565b9050919050565b60006136b0826124a3565b91506136bb836124a3565b92508282026136c9816124a3565b915082820484148315176136e0576136df612bfe565b5b5092915050565b60006136f2826124a3565b91506000820361370557613704612bfe565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613746602083612540565b915061375182613710565b602082019050919050565b6000602082019050818103600083015261377581613739565b9050919050565b6000613787826124a3565b9150613792836124a3565b92508282039050818111156137aa576137a9612bfe565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220ea52cb3272a256f62b695ae21937377a7ea8ac6a47f3579126b1a2b8ae945be764736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806342966c681161010f578063a217fddf116100a2578063d539139311610071578063d5391393146105b9578063d547741f146105d7578063dd62ed3e146105f3578063e63ab1e914610623576101f0565b8063a217fddf1461050b578063a457c2d714610529578063a9059cbb14610559578063ca15c87314610589576101f0565b80638456cb59116100de5780638456cb59146104835780639010d07c1461048d57806391d14854146104bd57806395d89b41146104ed576101f0565b806342966c68146103fd5780635c975abb1461041957806370a082311461043757806379cc679014610467576101f0565b8063282c51f311610187578063372500ab11610156578063372500ab1461039d57806339509351146103a75780633f4ba83a146103d757806340c10f19146103e1576101f0565b8063282c51f3146103295780632f2ff15d14610347578063313ce5671461036357806336568abe14610381576101f0565b806318160ddd116101c357806318160ddd1461028f5780631cf2c7e2146102ad57806323b872dd146102c9578063248a9ca3146102f9576101f0565b806301ffc9a7146101f557806303f24de11461022557806306fdde0314610241578063095ea7b31461025f575b600080fd5b61020f600480360381019061020a91906122fa565b610641565b60405161021c9190612342565b60405180910390f35b61023f600480360381019061023a91906124d9565b6106bb565b005b610249610786565b60405161025691906125b4565b60405180910390f35b61027960048036038101906102749190612634565b610818565b6040516102869190612342565b60405180910390f35b61029761083b565b6040516102a49190612683565b60405180910390f35b6102c760048036038101906102c29190612634565b610845565b005b6102e360048036038101906102de919061269e565b6108c3565b6040516102f09190612342565b60405180910390f35b610313600480360381019061030e9190612727565b6108f2565b6040516103209190612763565b60405180910390f35b610331610911565b60405161033e9190612763565b60405180910390f35b610361600480360381019061035c919061277e565b610935565b005b61036b610956565b60405161037891906127da565b60405180910390f35b61039b6004803603810190610396919061277e565b61096d565b005b6103a56109f0565b005b6103c160048036038101906103bc9190612634565b610a74565b6040516103ce9190612342565b60405180910390f35b6103df610aab565b005b6103fb60048036038101906103f69190612634565b610b25565b005b610417600480360381019061041291906127f5565b610ba3565b005b610421610bb7565b60405161042e9190612342565b60405180910390f35b610451600480360381019061044c9190612822565b610bce565b60405161045e9190612683565b60405180910390f35b610481600480360381019061047c9190612634565b610c17565b005b61048b610c37565b005b6104a760048036038101906104a2919061284f565b610cb1565b6040516104b4919061289e565b60405180910390f35b6104d760048036038101906104d2919061277e565b610ce0565b6040516104e49190612342565b60405180910390f35b6104f5610d4a565b60405161050291906125b4565b60405180910390f35b610513610ddc565b6040516105209190612763565b60405180910390f35b610543600480360381019061053e9190612634565b610de3565b6040516105509190612342565b60405180910390f35b610573600480360381019061056e9190612634565b610e5a565b6040516105809190612342565b60405180910390f35b6105a3600480360381019061059e9190612727565b610e7d565b6040516105b09190612683565b60405180910390f35b6105c1610ea1565b6040516105ce9190612763565b60405180910390f35b6105f160048036038101906105ec919061277e565b610ec5565b005b61060d600480360381019061060891906128b9565b610ee6565b60405161061a9190612683565b60405180910390f35b61062b610f6d565b6040516106389190612763565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b457506106b382610f91565b5b9050919050565b600061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b81526004016106fc939291906128f9565b6020604051808303816000875af115801561071b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073f9190612963565b905080610781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610778906129dc565b60405180910390fd5b505050565b60606005805461079590612a2b565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190612a2b565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905090565b60008061082361100b565b9050610830818585611013565b600191505092915050565b6000600454905090565b6108767f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84861087161100b565b610ce0565b6108b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ac90612ace565b60405180910390fd5b6108bf82826111dc565b5050565b6000806108ce61100b565b90506108db8582856113ab565b6108e6858585611437565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61093e826108f2565b610947816116b0565b61095183836116c4565b505050565b6000600760019054906101000a900460ff16905090565b61097561100b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d990612b60565b60405180910390fd5b6109ec82826116f8565b5050565b61080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f3060646040518363ffffffff1660e01b8152600401610a2e929190612bd5565b6020604051808303816000875af1158015610a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a719190612963565b50565b600080610a7f61100b565b9050610aa0818585610a918589610ee6565b610a9b9190612c2d565b611013565b600191505092915050565b610adc7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ad761100b565b610ce0565b610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1290612cd3565b60405180910390fd5b610b2361172c565b565b610b567f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610b5161100b565b610ce0565b610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90612d65565b60405180910390fd5b610b9f828261178f565b5050565b610bb4610bae61100b565b826111dc565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c2982610c2361100b565b836113ab565b610c3382826111dc565b5050565b610c687f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c6361100b565b610ce0565b610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90612df7565b60405180910390fd5b610caf6118e6565b565b6000610cd8826001600086815260200190815260200160002061194990919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610d5990612a2b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8590612a2b565b8015610dd25780601f10610da757610100808354040283529160200191610dd2565b820191906000526020600020905b815481529060010190602001808311610db557829003601f168201915b5050505050905090565b6000801b81565b600080610dee61100b565b90506000610dfc8286610ee6565b905083811015610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3890612e89565b60405180910390fd5b610e4e8286868403611013565b60019250505092915050565b600080610e6561100b565b9050610e72818585611437565b600191505092915050565b6000610e9a60016000848152602001908152602001600020611963565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610ece826108f2565b610ed7816116b0565b610ee183836116f8565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611004575061100382611978565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107990612f1b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890612fad565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111cf9190612683565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361124b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112429061303f565b60405180910390fd5b611257826000836119e2565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d5906130d1565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113929190612683565b60405180910390a36113a683600084611aa7565b505050565b60006113b78484610ee6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114315781811015611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a9061313d565b60405180910390fd5b6114308484848403611013565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d906131cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c90613261565b60405180910390fd5b6115208383836119e2565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e906132f3565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116979190612683565b60405180910390a36116aa848484611aa7565b50505050565b6116c1816116bc61100b565b611aac565b50565b6116ce8282611b31565b6116f38160016000858152602001908152602001600020611c1190919063ffffffff16565b505050565b6117028282611c41565b6117278160016000858152602001908152602001600020611d2290919063ffffffff16565b505050565b611734611d52565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61177861100b565b604051611785919061289e565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f59061335f565b60405180910390fd5b61180a600083836119e2565b806004600082825461181c9190612c2d565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118ce9190612683565b60405180910390a36118e260008383611aa7565b5050565b6118ee611d9b565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861193261100b565b60405161193f919061289e565b60405180910390a1565b60006119588360000183611de5565b60001c905092915050565b600061197182600001611e10565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b7f6a7461657441bf111caa502b48bec73847d91c1265dc315d914c2d2a6c95fcfe838383604051611a159392919061337f565b60405180910390a160005b6005811015611a96573073ffffffffffffffffffffffffffffffffffffffff1663372500ab6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a7157600080fd5b505af1925050508015611a82575060015b508080611a8e906133b6565b915050611a20565b50611aa2838383611e21565b505050565b505050565b611ab68282610ce0565b611b2d57611ac381611e79565b611ad18360001c6020611ea6565b604051602001611ae29291906134d2565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2491906125b4565b60405180910390fd5b5050565b611b3b8282610ce0565b611c0d57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bb261100b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611c39836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6120e2565b905092915050565b611c4b8282610ce0565b15611d1e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611cc361100b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611d4a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612152565b905092915050565b611d5a610bb7565b611d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9090613558565b60405180910390fd5b565b611da3610bb7565b15611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda906135c4565b60405180910390fd5b565b6000826000018281548110611dfd57611dfc6135e4565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611e2c838383612266565b611e34610bb7565b15611e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6b90613685565b60405180910390fd5b505050565b6060611e9f8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611ea6565b9050919050565b606060006002836002611eb991906136a5565b611ec39190612c2d565b67ffffffffffffffff811115611edc57611edb612378565b5b6040519080825280601f01601f191660200182016040528015611f0e5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611f4657611f456135e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611faa57611fa96135e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611fea91906136a5565b611ff49190612c2d565b90505b6001811115612094577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612036576120356135e4565b5b1a60f81b82828151811061204d5761204c6135e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061208d906136e7565b9050611ff7565b50600084146120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf9061375c565b60405180910390fd5b8091505092915050565b60006120ee838361226b565b61214757826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061214c565b600090505b92915050565b6000808360010160008481526020019081526020016000205490506000811461225a576000600182612184919061377c565b905060006001866000018054905061219c919061377c565b905081811461220b5760008660000182815481106121bd576121bc6135e4565b5b90600052602060002001549050808760000184815481106121e1576121e06135e4565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061221f5761221e6137b0565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612260565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122d7816122a2565b81146122e257600080fd5b50565b6000813590506122f4816122ce565b92915050565b6000602082840312156123105761230f612298565b5b600061231e848285016122e5565b91505092915050565b60008115159050919050565b61233c81612327565b82525050565b60006020820190506123576000830184612333565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123b082612367565b810181811067ffffffffffffffff821117156123cf576123ce612378565b5b80604052505050565b60006123e261228e565b90506123ee82826123a7565b919050565b600067ffffffffffffffff82111561240e5761240d612378565b5b61241782612367565b9050602081019050919050565b82818337600083830152505050565b6000612446612441846123f3565b6123d8565b90508281526020810184848401111561246257612461612362565b5b61246d848285612424565b509392505050565b600082601f83011261248a5761248961235d565b5b813561249a848260208601612433565b91505092915050565b6000819050919050565b6124b6816124a3565b81146124c157600080fd5b50565b6000813590506124d3816124ad565b92915050565b600080604083850312156124f0576124ef612298565b5b600083013567ffffffffffffffff81111561250e5761250d61229d565b5b61251a85828601612475565b925050602061252b858286016124c4565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561256f578082015181840152602081019050612554565b60008484015250505050565b600061258682612535565b6125908185612540565b93506125a0818560208601612551565b6125a981612367565b840191505092915050565b600060208201905081810360008301526125ce818461257b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612601826125d6565b9050919050565b612611816125f6565b811461261c57600080fd5b50565b60008135905061262e81612608565b92915050565b6000806040838503121561264b5761264a612298565b5b60006126598582860161261f565b925050602061266a858286016124c4565b9150509250929050565b61267d816124a3565b82525050565b60006020820190506126986000830184612674565b92915050565b6000806000606084860312156126b7576126b6612298565b5b60006126c58682870161261f565b93505060206126d68682870161261f565b92505060406126e7868287016124c4565b9150509250925092565b6000819050919050565b612704816126f1565b811461270f57600080fd5b50565b600081359050612721816126fb565b92915050565b60006020828403121561273d5761273c612298565b5b600061274b84828501612712565b91505092915050565b61275d816126f1565b82525050565b60006020820190506127786000830184612754565b92915050565b6000806040838503121561279557612794612298565b5b60006127a385828601612712565b92505060206127b48582860161261f565b9150509250929050565b600060ff82169050919050565b6127d4816127be565b82525050565b60006020820190506127ef60008301846127cb565b92915050565b60006020828403121561280b5761280a612298565b5b6000612819848285016124c4565b91505092915050565b60006020828403121561283857612837612298565b5b60006128468482850161261f565b91505092915050565b6000806040838503121561286657612865612298565b5b600061287485828601612712565b9250506020612885858286016124c4565b9150509250929050565b612898816125f6565b82525050565b60006020820190506128b3600083018461288f565b92915050565b600080604083850312156128d0576128cf612298565b5b60006128de8582860161261f565b92505060206128ef8582860161261f565b9150509250929050565b600060608201905061290e600083018661288f565b8181036020830152612920818561257b565b905061292f6040830184612674565b949350505050565b61294081612327565b811461294b57600080fd5b50565b60008151905061295d81612937565b92915050565b60006020828403121561297957612978612298565b5b60006129878482850161294e565b91505092915050565b7f6661696c656420746f207374616b650000000000000000000000000000000000600082015250565b60006129c6600f83612540565b91506129d182612990565b602082019050919050565b600060208201905081810360008301526129f5816129b9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a4357607f821691505b602082108103612a5657612a556129fc565b5b50919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206275726e657220726f6c6520746f206275726e0000000000000000602082015250565b6000612ab8603883612540565b9150612ac382612a5c565b604082019050919050565b60006020820190508181036000830152612ae781612aab565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612b4a602f83612540565b9150612b5582612aee565b604082019050919050565b60006020820190508181036000830152612b7981612b3d565b9050919050565b6000819050919050565b600063ffffffff82169050919050565b6000819050919050565b6000612bbf612bba612bb584612b80565b612b9a565b612b8a565b9050919050565b612bcf81612ba4565b82525050565b6000604082019050612bea600083018561288f565b612bf76020830184612bc6565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c38826124a3565b9150612c43836124a3565b9250828201905080821115612c5b57612c5a612bfe565b5b92915050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b6000612cbd603b83612540565b9150612cc882612c61565b604082019050919050565b60006020820190508181036000830152612cec81612cb0565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b6000612d4f603883612540565b9150612d5a82612cf3565b604082019050919050565b60006020820190508181036000830152612d7e81612d42565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b6000612de1603983612540565b9150612dec82612d85565b604082019050919050565b60006020820190508181036000830152612e1081612dd4565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e73602583612540565b9150612e7e82612e17565b604082019050919050565b60006020820190508181036000830152612ea281612e66565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612f05602483612540565b9150612f1082612ea9565b604082019050919050565b60006020820190508181036000830152612f3481612ef8565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f97602283612540565b9150612fa282612f3b565b604082019050919050565b60006020820190508181036000830152612fc681612f8a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613029602183612540565b915061303482612fcd565b604082019050919050565b600060208201905081810360008301526130588161301c565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006130bb602283612540565b91506130c68261305f565b604082019050919050565b600060208201905081810360008301526130ea816130ae565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613127601d83612540565b9150613132826130f1565b602082019050919050565b600060208201905081810360008301526131568161311a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006131b9602583612540565b91506131c48261315d565b604082019050919050565b600060208201905081810360008301526131e8816131ac565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061324b602383612540565b9150613256826131ef565b604082019050919050565b6000602082019050818103600083015261327a8161323e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006132dd602683612540565b91506132e882613281565b604082019050919050565b6000602082019050818103600083015261330c816132d0565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613349601f83612540565b915061335482613313565b602082019050919050565b600060208201905081810360008301526133788161333c565b9050919050565b6000606082019050613394600083018661288f565b6133a1602083018561288f565b6133ae6040830184612674565b949350505050565b60006133c1826124a3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133f3576133f2612bfe565b5b600182019050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061343f6017836133fe565b915061344a82613409565b601782019050919050565b600061346082612535565b61346a81856133fe565b935061347a818560208601612551565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006134bc6011836133fe565b91506134c782613486565b601182019050919050565b60006134dd82613432565b91506134e98285613455565b91506134f4826134af565b91506135008284613455565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613542601483612540565b915061354d8261350c565b602082019050919050565b6000602082019050818103600083015261357181613535565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006135ae601083612540565b91506135b982613578565b602082019050919050565b600060208201905081810360008301526135dd816135a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b600061366f602a83612540565b915061367a82613613565b604082019050919050565b6000602082019050818103600083015261369e81613662565b9050919050565b60006136b0826124a3565b91506136bb836124a3565b92508282026136c9816124a3565b915082820484148315176136e0576136df612bfe565b5b5092915050565b60006136f2826124a3565b91506000820361370557613704612bfe565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613746602083612540565b915061375182613710565b602082019050919050565b6000602082019050818103600083015261377581613739565b9050919050565b6000613787826124a3565b9150613792836124a3565b92508282039050818111156137aa576137a9612bfe565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220ea52cb3272a256f62b695ae21937377a7ea8ac6a47f3579126b1a2b8ae945be764736f6c63430008140033", + "bytecode": "0x60806040523461046e57611dd38038038061001981610472565b92833981019060608183031261046e5780516001600160401b03811161046e5782610045918301610497565b60208201519092906001600160401b03811161046e57604091610069918401610497565b91015160ff8116810361046e5782516001600160401b03811161039c57600554600181811c91168015610464575b602082101461037e57601f811161041e575b506020601f82116001146103bb57819293945f926103b0575b50508160011b915f199060031b1c1916176005555b81516001600160401b03811161039c57600654600181811c91168015610392575b602082101461037e57601f811161031b575b50602092601f82116001146102ba57928192935f926102af575b50508160011b915f199060031b1c1916176006555b610142336104e8565b610277575b6101503361055e565b610232575b61015e336105de565b6101ed575b61016c3361065e565b610195575b61ff006007549160081b169061ff0019161760075560405161159190816107628239f35b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8485f5260016020526101e7337f4796a5437e25bdc491b74d328cf6b437c8587e216f52049c7df56421f51ae30f6106f1565b50610171565b5f80516020611d538339815191525f52600160205261022c337fb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a86106f1565b50610163565b5f80516020611d738339815191525f526001602052610271337f64e21244e91af723e1b962171ed4828dcecc0d7b89872e516a5db8266da800006106f1565b50610155565b5f805260016020526102a9337fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb496106f1565b50610147565b015190505f80610124565b601f1982169360065f52805f20915f5b86811061030357508360019596106102eb575b505050811b01600655610139565b01515f1960f88460031b161c191690555f80806102dd565b919260206001819286850151815501940192016102ca565b60065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f601f830160051c81019160208410610374575b601f0160051c01905b818110610369575061010a565b5f815560010161035c565b9091508190610353565b634e487b7160e01b5f52602260045260245ffd5b90607f16906100f8565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100c2565b601f1982169060055f52805f20915f5b818110610406575095836001959697106103ee575b505050811b016005556100d7565b01515f1960f88460031b161c191690555f80806103e0565b9192602060018192868b0151815501940192016103cb565b60055f5260205f20601f830160051c8101916020841061045a575b601f0160051c01905b81811061044f57506100a9565b5f8155600101610442565b9091508190610439565b90607f1690610097565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761039c57604052565b81601f8201121561046e578051906001600160401b03821161039c576104c6601f8301601f1916602001610472565b928284526020838301011161046e57815f9260208093018386015e8301015290565b6001600160a01b0381165f9081525f80516020611db3833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611db383398151915260205260408120805460ff191660011790553391905f80516020611cf38339815191528180a4600190565b505f90565b6001600160a01b0381165f9081525f80516020611d13833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611d1383398151915260205260408120805460ff191660011790553391905f80516020611d73833981519152905f80516020611cf38339815191529080a4600190565b6001600160a01b0381165f9081525f80516020611d33833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611d3383398151915260205260408120805460ff191660011790553391905f80516020611d53833981519152905f80516020611cf38339815191529080a4600190565b6001600160a01b0381165f9081525f80516020611d93833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611d9383398151915260205260408120805460ff191660011790553391907f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848905f80516020611cf38339815191529080a4600190565b6001810190825f528160205260405f2054155f1461075a5780546801000000000000000081101561039c5760018101808355811015610746578390825f5260205f20015554915f5260205260405f2055600190565b634e487b7160e01b5f52603260045260245ffd5b5050505f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610e815750806303f24de114610d4b57806306fdde0314610c90578063095ea7b314610be857806318160ddd14610bcb5780631cf2c7e214610b1c57806323b872dd14610ae4578063248a9ca314610ab2578063282c51f314610a785780632f2ff15d14610a13578063313ce567146109f057806336568abe146109ac578063372500ab146109375780633f4ba83a1461084b57806340c10f19146106bc57806342966c681461069f5780635c975abb1461067d57806370a082311461064557806379cc6790146106155780638456cb591461053a5780639010d07c146104f557806391d14854146104ad57806395d89b41146103a1578063a217fddf14610387578063a3246ad3146102d8578063a9059cbb146102a7578063ca15c8731461027d578063d539139314610243578063d547741f146101ff578063dd62ed3e146101af5763e63ab1e914610171575f80fd5b346101ab575f3660031901126101ab5760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5f80fd5b346101ab5760403660031901126101ab576101c8610f34565b6101d0610f4a565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b346101ab5760403660031901126101ab5761024160043561021e610f4a565b9061023c610237825f525f602052600160405f20015490565b61120e565b611246565b005b346101ab575f3660031901126101ab5760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b346101ab5760203660031901126101ab576004355f526001602052602060405f2054604051908152f35b346101ab5760403660031901126101ab576102cd6102c3610f34565b6024359033611114565b602060405160018152f35b346101ab5760203660031901126101ab576004355f52600160205260405f20604051806020835491828152019081935f5260205f20905f5b8181106103715750505081610326910382610eee565b604051918291602083019060208452518091526040830191905f5b81811061034f575050500390f35b82516001600160a01b0316845285945060209384019390920191600101610341565b8254845260209093019260019283019201610310565b346101ab575f3660031901126101ab5760206040515f8152f35b346101ab575f3660031901126101ab576040515f6006548060011c906001811680156104a3575b60208310811461048f5782855290811561046b575060011461040d575b610409836103f581850382610eee565b604051918291602083526020830190610f10565b0390f35b60065f9081527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939250905b808210610451575090915081016020016103f56103e5565b919260018160209254838588010152019101909291610439565b60ff191660208086019190915291151560051b840190910191506103f590506103e5565b634e487b7160e01b5f52602260045260245ffd5b91607f16916103c8565b346101ab5760403660031901126101ab576104c6610f4a565b6004355f525f60205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346101ab5760403660031901126101ab576004355f526001602052602061052160243560405f206113a3565b905460405160039290921b1c6001600160a01b03168152f35b346101ab575f3660031901126101ab57335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156105c157610588611388565b600160ff1960075416176007557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b60405162461bcd60e51b815260206004820152603960248201525f8051602061153c833981519152604482015278686176652070617573657220726f6c6520746f20706175736560381b6064820152608490fd5b346101ab5760403660031901126101ab57610241610631610f34565b60243590610640823383611071565b610f78565b346101ab5760203660031901126101ab576001600160a01b03610666610f34565b165f526002602052602060405f2054604051908152f35b346101ab575f3660031901126101ab57602060ff600754166040519015158152f35b346101ab5760203660031901126101ab5761024160043533610f78565b346101ab5760403660031901126101ab576106d5610f34565b335f9081527f0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c6020526040902054602435919060ff16156107f8576001600160a01b03169081156107e5575f805160206114fc83398151915260606040515f8152846020820152836040820152a15f5b600581106107a85750610756611388565b600454908082018092116107945760205f8051602061151c833981519152915f936004558484526002825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b303b156101ab5760405163372500ab60e01b8152600191905f8160048183305af16107d5575b5001610745565b5f6107df91610eee565b846107ce565b63ec442f0560e01b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152603860248201525f8051602061153c8339815191526044820152771a185d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60421b6064820152608490fd5b346101ab575f3660031901126101ab57335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156108df5760075460ff8116156108d05760ff19166007557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152603b60248201525f8051602061153c83398151915260448201527f686176652070617573657220726f6c6520746f20756e706175736500000000006064820152608490fd5b346101ab575f3660031901126101ab57604051632efe8a5f60e01b8152306004820152606460248201526020816044815f6108015af180156109a15761097957005b6102419060203d60201161099a575b6109928183610eee565b810190610f60565b503d610988565b6040513d5f823e3d90fd5b346101ab5760403660031901126101ab576109c5610f4a565b336001600160a01b038216036109e15761024190600435611246565b63334bd91960e11b5f5260045ffd5b346101ab575f3660031901126101ab57602060ff60075460081c16604051908152f35b346101ab5760403660031901126101ab57600435610a2f610f4a565b610a47610237835f525f602052600160405f20015490565b610a518183611280565b610a5757005b5f91825260016020526040909120610241916001600160a01b0316906113cc565b346101ab575f3660031901126101ab5760206040517f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8488152f35b346101ab5760203660031901126101ab576020610adc6004355f525f602052600160405f20015490565b604051908152f35b346101ab5760603660031901126101ab576102cd610b00610f34565b610b08610f4a565b60443591610b17833383611071565b611114565b346101ab5760403660031901126101ab57610b35610f34565b335f9081527f6bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870ae602052604090205460ff1615610b78576102419060243590610f78565b60405162461bcd60e51b815260206004820152603860248201525f8051602061153c8339815191526044820152773430bb3290313ab93732b9103937b632903a3790313ab93760411b6064820152608490fd5b346101ab575f3660031901126101ab576020600454604051908152f35b346101ab5760403660031901126101ab57610c01610f34565b602435903315610c7d576001600160a01b0316908115610c6a57335f52600360205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346101ab575f3660031901126101ab576040515f6005548060011c90600181168015610d41575b60208310811461048f5782855290811561046b5750600114610ce357610409836103f581850382610eee565b60055f9081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0939250905b808210610d27575090915081016020016103f56103e5565b919260018160209254838588010152019101909291610d0f565b91607f1691610cb7565b346101ab5760403660031901126101ab5760043567ffffffffffffffff81116101ab57366023820112156101ab5780600401359067ffffffffffffffff8211610e6d57604051610da5601f8401601f191660200182610eee565b82815236602484840101116101ab575f602084610df19560248396018386013783010152604051809381926353266bbb60e01b8352306004840152606060248401526064830190610f10565b602435604483015203815f6108005af19081156109a1575f91610e4e575b5015610e1757005b60405162461bcd60e51b815260206004820152600f60248201526e6661696c656420746f207374616b6560881b6044820152606490fd5b610e67915060203d60201161099a576109928183610eee565b81610e0f565b634e487b7160e01b5f52604160045260245ffd5b346101ab5760203660031901126101ab576004359063ffffffff60e01b82168092036101ab57602091635a05180f60e01b8114908115610ec3575b5015158152f35b637965db0b60e01b811491508115610edd575b5083610ebc565b6301ffc9a760e01b14905083610ed6565b90601f8019910116810190811067ffffffffffffffff821117610e6d57604052565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101ab57565b602435906001600160a01b03821682036101ab57565b908160209103126101ab575180151581036101ab5790565b9091906001600160a01b0316801561105e575f805160206114fc83398151915260606040518381525f6020820152856040820152a15f5b600581106110215750610fc0611388565b805f52600260205260405f2054838110611007576020845f94955f8051602061151c83398151915293858752600284520360408620558060045403600455604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b303b156101ab5760405163372500ab60e01b8152600191905f8160048183305af161104e575b5001610faf565b5f61105891610eee565b5f611047565b634b637e8f60e11b5f525f60045260245ffd5b6001600160a01b039081165f818152600360209081526040808320948616835293905291909120549291905f1984106110ab575b50505050565b8284106110f1578015610c7d576001600160a01b03821615610c6a575f52600360205260405f209060018060a01b03165f5260205260405f20910390555f8080806110a5565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b031690811561105e576001600160a01b03169182156107e5575f805160206114fc8339815191526060604051848152856020820152836040820152a15f5b600581106111d1575061116a611388565b815f52600260205260405f20548181106111b857815f8051602061151c83398151915292602092855f52600284520360405f2055845f526002825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b303b156101ab5760405163372500ab60e01b8152600191905f8160048183305af16111fe575b5001611159565b5f61120891610eee565b5f6111f7565b5f8181526020818152604080832033845290915290205460ff16156112305750565b63e2517d3f60e01b5f523360045260245260445ffd5b6112508282611308565b918261125b57505090565b5f9182526001602052604090912061127c916001600160a01b031690611436565b5090565b5f818152602081815260408083206001600160a01b038616845290915290205460ff16611302575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615611302575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b60ff6007541661139457565b63d93c066560e01b5f5260045ffd5b80548210156113b8575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6001810190825f528160205260405f2054155f1461142f578054600160401b811015610e6d5761141c6114068260018794018555846113a3565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b906001820191815f528260205260405f20548015155f146114f3575f1981018181116107945782545f19810191908211610794578181036114be575b505050805480156114aa575f19019061148b82826113a3565b8154905f199060031b1b19169055555f526020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b6114de6114ce61140693866113a3565b90549060031b1c928392866113a3565b90555f528360205260405f20555f8080611472565b505050505f9056fe6a7461657441bf111caa502b48bec73847d91c1265dc315d914c2d2a6c95fcfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332304d696e7465724275726e6572446563696d616c733a206d75737420a26469706673582212200936e17cab037bc23d09276f9d95f71be62b3571364593bff6dab85430ba4fdc64736f6c634300081a00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6cf7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870aead3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610e815750806303f24de114610d4b57806306fdde0314610c90578063095ea7b314610be857806318160ddd14610bcb5780631cf2c7e214610b1c57806323b872dd14610ae4578063248a9ca314610ab2578063282c51f314610a785780632f2ff15d14610a13578063313ce567146109f057806336568abe146109ac578063372500ab146109375780633f4ba83a1461084b57806340c10f19146106bc57806342966c681461069f5780635c975abb1461067d57806370a082311461064557806379cc6790146106155780638456cb591461053a5780639010d07c146104f557806391d14854146104ad57806395d89b41146103a1578063a217fddf14610387578063a3246ad3146102d8578063a9059cbb146102a7578063ca15c8731461027d578063d539139314610243578063d547741f146101ff578063dd62ed3e146101af5763e63ab1e914610171575f80fd5b346101ab575f3660031901126101ab5760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5f80fd5b346101ab5760403660031901126101ab576101c8610f34565b6101d0610f4a565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b346101ab5760403660031901126101ab5761024160043561021e610f4a565b9061023c610237825f525f602052600160405f20015490565b61120e565b611246565b005b346101ab575f3660031901126101ab5760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b346101ab5760203660031901126101ab576004355f526001602052602060405f2054604051908152f35b346101ab5760403660031901126101ab576102cd6102c3610f34565b6024359033611114565b602060405160018152f35b346101ab5760203660031901126101ab576004355f52600160205260405f20604051806020835491828152019081935f5260205f20905f5b8181106103715750505081610326910382610eee565b604051918291602083019060208452518091526040830191905f5b81811061034f575050500390f35b82516001600160a01b0316845285945060209384019390920191600101610341565b8254845260209093019260019283019201610310565b346101ab575f3660031901126101ab5760206040515f8152f35b346101ab575f3660031901126101ab576040515f6006548060011c906001811680156104a3575b60208310811461048f5782855290811561046b575060011461040d575b610409836103f581850382610eee565b604051918291602083526020830190610f10565b0390f35b60065f9081527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939250905b808210610451575090915081016020016103f56103e5565b919260018160209254838588010152019101909291610439565b60ff191660208086019190915291151560051b840190910191506103f590506103e5565b634e487b7160e01b5f52602260045260245ffd5b91607f16916103c8565b346101ab5760403660031901126101ab576104c6610f4a565b6004355f525f60205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346101ab5760403660031901126101ab576004355f526001602052602061052160243560405f206113a3565b905460405160039290921b1c6001600160a01b03168152f35b346101ab575f3660031901126101ab57335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156105c157610588611388565b600160ff1960075416176007557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b60405162461bcd60e51b815260206004820152603960248201525f8051602061153c833981519152604482015278686176652070617573657220726f6c6520746f20706175736560381b6064820152608490fd5b346101ab5760403660031901126101ab57610241610631610f34565b60243590610640823383611071565b610f78565b346101ab5760203660031901126101ab576001600160a01b03610666610f34565b165f526002602052602060405f2054604051908152f35b346101ab575f3660031901126101ab57602060ff600754166040519015158152f35b346101ab5760203660031901126101ab5761024160043533610f78565b346101ab5760403660031901126101ab576106d5610f34565b335f9081527f0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c6020526040902054602435919060ff16156107f8576001600160a01b03169081156107e5575f805160206114fc83398151915260606040515f8152846020820152836040820152a15f5b600581106107a85750610756611388565b600454908082018092116107945760205f8051602061151c833981519152915f936004558484526002825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b303b156101ab5760405163372500ab60e01b8152600191905f8160048183305af16107d5575b5001610745565b5f6107df91610eee565b846107ce565b63ec442f0560e01b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152603860248201525f8051602061153c8339815191526044820152771a185d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60421b6064820152608490fd5b346101ab575f3660031901126101ab57335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156108df5760075460ff8116156108d05760ff19166007557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152603b60248201525f8051602061153c83398151915260448201527f686176652070617573657220726f6c6520746f20756e706175736500000000006064820152608490fd5b346101ab575f3660031901126101ab57604051632efe8a5f60e01b8152306004820152606460248201526020816044815f6108015af180156109a15761097957005b6102419060203d60201161099a575b6109928183610eee565b810190610f60565b503d610988565b6040513d5f823e3d90fd5b346101ab5760403660031901126101ab576109c5610f4a565b336001600160a01b038216036109e15761024190600435611246565b63334bd91960e11b5f5260045ffd5b346101ab575f3660031901126101ab57602060ff60075460081c16604051908152f35b346101ab5760403660031901126101ab57600435610a2f610f4a565b610a47610237835f525f602052600160405f20015490565b610a518183611280565b610a5757005b5f91825260016020526040909120610241916001600160a01b0316906113cc565b346101ab575f3660031901126101ab5760206040517f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8488152f35b346101ab5760203660031901126101ab576020610adc6004355f525f602052600160405f20015490565b604051908152f35b346101ab5760603660031901126101ab576102cd610b00610f34565b610b08610f4a565b60443591610b17833383611071565b611114565b346101ab5760403660031901126101ab57610b35610f34565b335f9081527f6bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870ae602052604090205460ff1615610b78576102419060243590610f78565b60405162461bcd60e51b815260206004820152603860248201525f8051602061153c8339815191526044820152773430bb3290313ab93732b9103937b632903a3790313ab93760411b6064820152608490fd5b346101ab575f3660031901126101ab576020600454604051908152f35b346101ab5760403660031901126101ab57610c01610f34565b602435903315610c7d576001600160a01b0316908115610c6a57335f52600360205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346101ab575f3660031901126101ab576040515f6005548060011c90600181168015610d41575b60208310811461048f5782855290811561046b5750600114610ce357610409836103f581850382610eee565b60055f9081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0939250905b808210610d27575090915081016020016103f56103e5565b919260018160209254838588010152019101909291610d0f565b91607f1691610cb7565b346101ab5760403660031901126101ab5760043567ffffffffffffffff81116101ab57366023820112156101ab5780600401359067ffffffffffffffff8211610e6d57604051610da5601f8401601f191660200182610eee565b82815236602484840101116101ab575f602084610df19560248396018386013783010152604051809381926353266bbb60e01b8352306004840152606060248401526064830190610f10565b602435604483015203815f6108005af19081156109a1575f91610e4e575b5015610e1757005b60405162461bcd60e51b815260206004820152600f60248201526e6661696c656420746f207374616b6560881b6044820152606490fd5b610e67915060203d60201161099a576109928183610eee565b81610e0f565b634e487b7160e01b5f52604160045260245ffd5b346101ab5760203660031901126101ab576004359063ffffffff60e01b82168092036101ab57602091635a05180f60e01b8114908115610ec3575b5015158152f35b637965db0b60e01b811491508115610edd575b5083610ebc565b6301ffc9a760e01b14905083610ed6565b90601f8019910116810190811067ffffffffffffffff821117610e6d57604052565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101ab57565b602435906001600160a01b03821682036101ab57565b908160209103126101ab575180151581036101ab5790565b9091906001600160a01b0316801561105e575f805160206114fc83398151915260606040518381525f6020820152856040820152a15f5b600581106110215750610fc0611388565b805f52600260205260405f2054838110611007576020845f94955f8051602061151c83398151915293858752600284520360408620558060045403600455604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b303b156101ab5760405163372500ab60e01b8152600191905f8160048183305af161104e575b5001610faf565b5f61105891610eee565b5f611047565b634b637e8f60e11b5f525f60045260245ffd5b6001600160a01b039081165f818152600360209081526040808320948616835293905291909120549291905f1984106110ab575b50505050565b8284106110f1578015610c7d576001600160a01b03821615610c6a575f52600360205260405f209060018060a01b03165f5260205260405f20910390555f8080806110a5565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b031690811561105e576001600160a01b03169182156107e5575f805160206114fc8339815191526060604051848152856020820152836040820152a15f5b600581106111d1575061116a611388565b815f52600260205260405f20548181106111b857815f8051602061151c83398151915292602092855f52600284520360405f2055845f526002825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b303b156101ab5760405163372500ab60e01b8152600191905f8160048183305af16111fe575b5001611159565b5f61120891610eee565b5f6111f7565b5f8181526020818152604080832033845290915290205460ff16156112305750565b63e2517d3f60e01b5f523360045260245260445ffd5b6112508282611308565b918261125b57505090565b5f9182526001602052604090912061127c916001600160a01b031690611436565b5090565b5f818152602081815260408083206001600160a01b038616845290915290205460ff16611302575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615611302575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b60ff6007541661139457565b63d93c066560e01b5f5260045ffd5b80548210156113b8575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6001810190825f528160205260405f2054155f1461142f578054600160401b811015610e6d5761141c6114068260018794018555846113a3565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b906001820191815f528260205260405f20548015155f146114f3575f1981018181116107945782545f19810191908211610794578181036114be575b505050805480156114aa575f19019061148b82826113a3565b8154905f199060031b1b19169055555f526020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b6114de6114ce61140693866113a3565b90549060031b1c928392866113a3565b90555f528360205260405f20555f8080611472565b505050505f9056fe6a7461657441bf111caa502b48bec73847d91c1265dc315d914c2d2a6c95fcfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332304d696e7465724275726e6572446563696d616c733a206d75737420a26469706673582212200936e17cab037bc23d09276f9d95f71be62b3571364593bff6dab85430ba4fdc64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/ERC20RecursiveNonRevertingPrecompileCall.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/contracts/solidity/ERC20RecursiveNonRevertingPrecompileCall.sol b/contracts/solidity/ERC20RecursiveNonRevertingPrecompileCall.sol index 3ebb391a6..2835fd2cc 100644 --- a/contracts/solidity/ERC20RecursiveNonRevertingPrecompileCall.sol +++ b/contracts/solidity/ERC20RecursiveNonRevertingPrecompileCall.sol @@ -6,7 +6,7 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol"; -import "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; +import "@openzeppelin/contracts/access/extensions/AccessControlEnumerable.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "./precompiles/distribution/DistributionI.sol" as distribution; import "./precompiles/staking/StakingI.sol" as staking; @@ -121,24 +121,14 @@ contract ERC20RecursiveNonRevertingPrecompileCall is Context, AccessControlEnume _unpause(); } - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override(ERC20, ERC20Pausable) { - // Emit an event to track if this hook is called - emit BeforeTokenTransferHookCalled(from, to, amount); - - for(uint256 i=0; i < 5; i++) { - try ERC20RecursiveNonRevertingPrecompileCall(address(this)).claimRewards() { - - } catch { - - } + function _update(address from, address to, uint256 value) internal virtual override(ERC20, ERC20Pausable) { + emit BeforeTokenTransferHookCalled(from, to, value); + for (uint256 i = 0; i < 5; i++) { + try ERC20RecursiveNonRevertingPrecompileCall(address(this)).claimRewards() {} catch {} } - super._beforeTokenTransfer(from, to, amount); + super._update(from, to, value); } function delegate( diff --git a/contracts/solidity/ERC20RecursiveRevertingPrecompileCall.json b/contracts/solidity/ERC20RecursiveRevertingPrecompileCall.json index 73424a1eb..039668af0 100644 --- a/contracts/solidity/ERC20RecursiveRevertingPrecompileCall.json +++ b/contracts/solidity/ERC20RecursiveRevertingPrecompileCall.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "ERC20RecursiveRevertingPrecompileCall", "sourceName": "solidity/ERC20RecursiveRevertingPrecompileCall.sol", "abi": [ @@ -24,6 +24,123 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -285,7 +402,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -323,7 +440,7 @@ "inputs": [ { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -359,7 +476,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -388,30 +505,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -498,16 +591,17 @@ "internalType": "bytes32", "name": "role", "type": "bytes32" - }, + } + ], + "name": "getRoleMembers", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "address[]", + "name": "", + "type": "address[]" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -523,31 +617,25 @@ "type": "address" } ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "increaseAllowance", + "name": "hasRole", "outputs": [ { "internalType": "bool", @@ -555,7 +643,7 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -618,7 +706,7 @@ }, { "internalType": "address", - "name": "account", + "name": "callerConfirmation", "type": "address" } ], @@ -699,7 +787,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -728,7 +816,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -751,8 +839,11 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b50604051620041d3380380620041d38339818101604052810190620000379190620005e0565b828281600590816200004a9190620008c5565b5080600690816200005c9190620008c5565b5050506000600760006101000a81548160ff0219169083151502179055506200009e6000801b620000926200017b60201b60201c565b6200018360201b60201c565b620000df7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000d36200017b60201b60201c565b6200018360201b60201c565b620001207f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001146200017b60201b60201c565b6200018360201b60201c565b620001617f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848620001556200017b60201b60201c565b6200018360201b60201c565b6200017281620001c160201b60201c565b505050620009ac565b600033905090565b620001958282620001df60201b60201c565b620001bc8160016000858152602001908152602001600020620002d060201b90919060201c565b505050565b80600760016101000a81548160ff021916908360ff16021790555050565b620001f182826200030860201b60201c565b620002cc57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002716200017b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000300836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200037260201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620003868383620003ec60201b60201c565b620003e1578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620003e6565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000478826200042d565b810181811067ffffffffffffffff821117156200049a57620004996200043e565b5b80604052505050565b6000620004af6200040f565b9050620004bd82826200046d565b919050565b600067ffffffffffffffff821115620004e057620004df6200043e565b5b620004eb826200042d565b9050602081019050919050565b60005b8381101562000518578082015181840152602081019050620004fb565b60008484015250505050565b60006200053b6200053584620004c2565b620004a3565b9050828152602081018484840111156200055a576200055962000428565b5b62000567848285620004f8565b509392505050565b600082601f83011262000587576200058662000423565b5b81516200059984826020860162000524565b91505092915050565b600060ff82169050919050565b620005ba81620005a2565b8114620005c657600080fd5b50565b600081519050620005da81620005af565b92915050565b600080600060608486031215620005fc57620005fb62000419565b5b600084015167ffffffffffffffff8111156200061d576200061c6200041e565b5b6200062b868287016200056f565b935050602084015167ffffffffffffffff8111156200064f576200064e6200041e565b5b6200065d868287016200056f565b92505060406200067086828701620005c9565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006cd57607f821691505b602082108103620006e357620006e262000685565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200074d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200070e565b6200075986836200070e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007a6620007a06200079a8462000771565b6200077b565b62000771565b9050919050565b6000819050919050565b620007c28362000785565b620007da620007d182620007ad565b8484546200071b565b825550505050565b600090565b620007f1620007e2565b620007fe818484620007b7565b505050565b5b8181101562000826576200081a600082620007e7565b60018101905062000804565b5050565b601f82111562000875576200083f81620006e9565b6200084a84620006fe565b810160208510156200085a578190505b620008726200086985620006fe565b83018262000803565b50505b505050565b600082821c905092915050565b60006200089a600019846008026200087a565b1980831691505092915050565b6000620008b5838362000887565b9150826002028217905092915050565b620008d0826200067a565b67ffffffffffffffff811115620008ec57620008eb6200043e565b5b620008f88254620006b4565b620009058282856200082a565b600060209050601f8311600181146200093d576000841562000928578287015190505b620009348582620008a7565b865550620009a4565b601f1984166200094d86620006e9565b60005b82811015620009775784890151825560018201915060208501945060208101905062000950565b8683101562000997578489015162000993601f89168262000887565b8355505b6001600288020188555050505b505050505050565b61381780620009bc6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806342966c681161010f578063a217fddf116100a2578063d539139311610071578063d5391393146105b9578063d547741f146105d7578063dd62ed3e146105f3578063e63ab1e914610623576101f0565b8063a217fddf1461050b578063a457c2d714610529578063a9059cbb14610559578063ca15c87314610589576101f0565b80638456cb59116100de5780638456cb59146104835780639010d07c1461048d57806391d14854146104bd57806395d89b41146104ed576101f0565b806342966c68146103fd5780635c975abb1461041957806370a082311461043757806379cc679014610467576101f0565b8063282c51f31161018757806336568abe1161015657806336568abe1461038b57806339509351146103a75780633f4ba83a146103d757806340c10f19146103e1576101f0565b8063282c51f3146103295780632c0503d4146103475780632f2ff15d14610351578063313ce5671461036d576101f0565b806318160ddd116101c357806318160ddd1461028f5780631cf2c7e2146102ad57806323b872dd146102c9578063248a9ca3146102f9576101f0565b806301ffc9a7146101f557806303f24de11461022557806306fdde0314610241578063095ea7b31461025f575b600080fd5b61020f600480360381019061020a91906122fc565b610641565b60405161021c9190612344565b60405180910390f35b61023f600480360381019061023a91906124db565b6106bb565b005b610249610786565b60405161025691906125b6565b60405180910390f35b61027960048036038101906102749190612636565b610818565b6040516102869190612344565b60405180910390f35b61029761083b565b6040516102a49190612685565b60405180910390f35b6102c760048036038101906102c29190612636565b610845565b005b6102e360048036038101906102de91906126a0565b6108c3565b6040516102f09190612344565b60405180910390f35b610313600480360381019061030e9190612729565b6108f2565b6040516103209190612765565b60405180910390f35b610331610911565b60405161033e9190612765565b60405180910390f35b61034f610935565b005b61036b60048036038101906103669190612780565b6109bb565b005b6103756109dc565b60405161038291906127dc565b60405180910390f35b6103a560048036038101906103a09190612780565b6109f3565b005b6103c160048036038101906103bc9190612636565b610a76565b6040516103ce9190612344565b60405180910390f35b6103df610aad565b005b6103fb60048036038101906103f69190612636565b610b27565b005b610417600480360381019061041291906127f7565b610ba5565b005b610421610bb9565b60405161042e9190612344565b60405180910390f35b610451600480360381019061044c9190612824565b610bd0565b60405161045e9190612685565b60405180910390f35b610481600480360381019061047c9190612636565b610c19565b005b61048b610c39565b005b6104a760048036038101906104a29190612851565b610cb3565b6040516104b491906128a0565b60405180910390f35b6104d760048036038101906104d29190612780565b610ce2565b6040516104e49190612344565b60405180910390f35b6104f5610d4c565b60405161050291906125b6565b60405180910390f35b610513610dde565b6040516105209190612765565b60405180910390f35b610543600480360381019061053e9190612636565b610de5565b6040516105509190612344565b60405180910390f35b610573600480360381019061056e9190612636565b610e5c565b6040516105809190612344565b60405180910390f35b6105a3600480360381019061059e9190612729565b610e7f565b6040516105b09190612685565b60405180910390f35b6105c1610ea3565b6040516105ce9190612765565b60405180910390f35b6105f160048036038101906105ec9190612780565b610ec7565b005b61060d600480360381019061060891906128bb565b610ee8565b60405161061a9190612685565b60405180910390f35b61062b610f6f565b6040516106389190612765565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b457506106b382610f93565b5b9050919050565b600061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b81526004016106fc939291906128fb565b6020604051808303816000875af115801561071b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073f9190612965565b905080610781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610778906129de565b60405180910390fd5b505050565b60606005805461079590612a2d565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190612a2d565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905090565b60008061082361100d565b9050610830818585611015565b600191505092915050565b6000600454905090565b6108767f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84861087161100d565b610ce2565b6108b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ac90612ad0565b60405180910390fd5b6108bf82826111de565b5050565b6000806108ce61100d565b90506108db8582856113ad565b6108e6858585611439565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f3060646040518363ffffffff1660e01b8152600401610973929190612b45565b6020604051808303816000875af1158015610992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b69190612965565b600080fd5b6109c4826108f2565b6109cd816116b2565b6109d783836116c6565b505050565b6000600760019054906101000a900460ff16905090565b6109fb61100d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f90612be0565b60405180910390fd5b610a7282826116fa565b5050565b600080610a8161100d565b9050610aa2818585610a938589610ee8565b610a9d9190612c2f565b611015565b600191505092915050565b610ade7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ad961100d565b610ce2565b610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1490612cd5565b60405180910390fd5b610b2561172e565b565b610b587f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610b5361100d565b610ce2565b610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e90612d67565b60405180910390fd5b610ba18282611791565b5050565b610bb6610bb061100d565b826111de565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c2b82610c2561100d565b836113ad565b610c3582826111de565b5050565b610c6a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c6561100d565b610ce2565b610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca090612df9565b60405180910390fd5b610cb16118e8565b565b6000610cda826001600086815260200190815260200160002061194b90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610d5b90612a2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8790612a2d565b8015610dd45780601f10610da957610100808354040283529160200191610dd4565b820191906000526020600020905b815481529060010190602001808311610db757829003601f168201915b5050505050905090565b6000801b81565b600080610df061100d565b90506000610dfe8286610ee8565b905083811015610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90612e8b565b60405180910390fd5b610e508286868403611015565b60019250505092915050565b600080610e6761100d565b9050610e74818585611439565b600191505092915050565b6000610e9c60016000848152602001908152602001600020611965565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610ed0826108f2565b610ed9816116b2565b610ee383836116fa565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061100657506110058261197a565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107b90612f1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90612faf565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111d19190612685565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124490613041565b60405180910390fd5b611259826000836119e4565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906130d3565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113949190612685565b60405180910390a36113a883600084611aa9565b505050565b60006113b98484610ee8565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114335781811015611425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141c9061313f565b60405180910390fd5b6114328484848403611015565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f906131d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150e90613263565b60405180910390fd5b6115228383836119e4565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a0906132f5565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116999190612685565b60405180910390a36116ac848484611aa9565b50505050565b6116c3816116be61100d565b611aae565b50565b6116d08282611b33565b6116f58160016000858152602001908152602001600020611c1390919063ffffffff16565b505050565b6117048282611c43565b6117298160016000858152602001908152602001600020611d2490919063ffffffff16565b505050565b611736611d54565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61177a61100d565b60405161178791906128a0565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613361565b60405180910390fd5b61180c600083836119e4565b806004600082825461181e9190612c2f565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118d09190612685565b60405180910390a36118e460008383611aa9565b5050565b6118f0611d9d565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861193461100d565b60405161194191906128a0565b60405180910390a1565b600061195a8360000183611de7565b60001c905092915050565b600061197382600001611e12565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b7f6a7461657441bf111caa502b48bec73847d91c1265dc315d914c2d2a6c95fcfe838383604051611a1793929190613381565b60405180910390a160005b6005811015611a98573073ffffffffffffffffffffffffffffffffffffffff16632c0503d46040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a7357600080fd5b505af1925050508015611a84575060015b508080611a90906133b8565b915050611a22565b50611aa4838383611e23565b505050565b505050565b611ab88282610ce2565b611b2f57611ac581611e7b565b611ad38360001c6020611ea8565b604051602001611ae49291906134d4565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2691906125b6565b60405180910390fd5b5050565b611b3d8282610ce2565b611c0f57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bb461100d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611c3b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6120e4565b905092915050565b611c4d8282610ce2565b15611d2057600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611cc561100d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611d4c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612154565b905092915050565b611d5c610bb9565b611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d929061355a565b60405180910390fd5b565b611da5610bb9565b15611de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddc906135c6565b60405180910390fd5b565b6000826000018281548110611dff57611dfe6135e6565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611e2e838383612268565b611e36610bb9565b15611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d90613687565b60405180910390fd5b505050565b6060611ea18273ffffffffffffffffffffffffffffffffffffffff16601460ff16611ea8565b9050919050565b606060006002836002611ebb91906136a7565b611ec59190612c2f565b67ffffffffffffffff811115611ede57611edd61237a565b5b6040519080825280601f01601f191660200182016040528015611f105781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611f4857611f476135e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611fac57611fab6135e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611fec91906136a7565b611ff69190612c2f565b90505b6001811115612096577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612038576120376135e6565b5b1a60f81b82828151811061204f5761204e6135e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061208f906136e9565b9050611ff9565b50600084146120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d19061375e565b60405180910390fd5b8091505092915050565b60006120f0838361226d565b61214957826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061214e565b600090505b92915050565b6000808360010160008481526020019081526020016000205490506000811461225c576000600182612186919061377e565b905060006001866000018054905061219e919061377e565b905081811461220d5760008660000182815481106121bf576121be6135e6565b5b90600052602060002001549050808760000184815481106121e3576121e26135e6565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612221576122206137b2565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612262565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122d9816122a4565b81146122e457600080fd5b50565b6000813590506122f6816122d0565b92915050565b6000602082840312156123125761231161229a565b5b6000612320848285016122e7565b91505092915050565b60008115159050919050565b61233e81612329565b82525050565b60006020820190506123596000830184612335565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123b282612369565b810181811067ffffffffffffffff821117156123d1576123d061237a565b5b80604052505050565b60006123e4612290565b90506123f082826123a9565b919050565b600067ffffffffffffffff8211156124105761240f61237a565b5b61241982612369565b9050602081019050919050565b82818337600083830152505050565b6000612448612443846123f5565b6123da565b90508281526020810184848401111561246457612463612364565b5b61246f848285612426565b509392505050565b600082601f83011261248c5761248b61235f565b5b813561249c848260208601612435565b91505092915050565b6000819050919050565b6124b8816124a5565b81146124c357600080fd5b50565b6000813590506124d5816124af565b92915050565b600080604083850312156124f2576124f161229a565b5b600083013567ffffffffffffffff8111156125105761250f61229f565b5b61251c85828601612477565b925050602061252d858286016124c6565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612571578082015181840152602081019050612556565b60008484015250505050565b600061258882612537565b6125928185612542565b93506125a2818560208601612553565b6125ab81612369565b840191505092915050565b600060208201905081810360008301526125d0818461257d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612603826125d8565b9050919050565b612613816125f8565b811461261e57600080fd5b50565b6000813590506126308161260a565b92915050565b6000806040838503121561264d5761264c61229a565b5b600061265b85828601612621565b925050602061266c858286016124c6565b9150509250929050565b61267f816124a5565b82525050565b600060208201905061269a6000830184612676565b92915050565b6000806000606084860312156126b9576126b861229a565b5b60006126c786828701612621565b93505060206126d886828701612621565b92505060406126e9868287016124c6565b9150509250925092565b6000819050919050565b612706816126f3565b811461271157600080fd5b50565b600081359050612723816126fd565b92915050565b60006020828403121561273f5761273e61229a565b5b600061274d84828501612714565b91505092915050565b61275f816126f3565b82525050565b600060208201905061277a6000830184612756565b92915050565b600080604083850312156127975761279661229a565b5b60006127a585828601612714565b92505060206127b685828601612621565b9150509250929050565b600060ff82169050919050565b6127d6816127c0565b82525050565b60006020820190506127f160008301846127cd565b92915050565b60006020828403121561280d5761280c61229a565b5b600061281b848285016124c6565b91505092915050565b60006020828403121561283a5761283961229a565b5b600061284884828501612621565b91505092915050565b600080604083850312156128685761286761229a565b5b600061287685828601612714565b9250506020612887858286016124c6565b9150509250929050565b61289a816125f8565b82525050565b60006020820190506128b56000830184612891565b92915050565b600080604083850312156128d2576128d161229a565b5b60006128e085828601612621565b92505060206128f185828601612621565b9150509250929050565b60006060820190506129106000830186612891565b8181036020830152612922818561257d565b90506129316040830184612676565b949350505050565b61294281612329565b811461294d57600080fd5b50565b60008151905061295f81612939565b92915050565b60006020828403121561297b5761297a61229a565b5b600061298984828501612950565b91505092915050565b7f6661696c656420746f207374616b650000000000000000000000000000000000600082015250565b60006129c8600f83612542565b91506129d382612992565b602082019050919050565b600060208201905081810360008301526129f7816129bb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a4557607f821691505b602082108103612a5857612a576129fe565b5b50919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206275726e657220726f6c6520746f206275726e0000000000000000602082015250565b6000612aba603883612542565b9150612ac582612a5e565b604082019050919050565b60006020820190508181036000830152612ae981612aad565b9050919050565b6000819050919050565b600063ffffffff82169050919050565b6000819050919050565b6000612b2f612b2a612b2584612af0565b612b0a565b612afa565b9050919050565b612b3f81612b14565b82525050565b6000604082019050612b5a6000830185612891565b612b676020830184612b36565b9392505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612bca602f83612542565b9150612bd582612b6e565b604082019050919050565b60006020820190508181036000830152612bf981612bbd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c3a826124a5565b9150612c45836124a5565b9250828201905080821115612c5d57612c5c612c00565b5b92915050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b6000612cbf603b83612542565b9150612cca82612c63565b604082019050919050565b60006020820190508181036000830152612cee81612cb2565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b6000612d51603883612542565b9150612d5c82612cf5565b604082019050919050565b60006020820190508181036000830152612d8081612d44565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b6000612de3603983612542565b9150612dee82612d87565b604082019050919050565b60006020820190508181036000830152612e1281612dd6565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e75602583612542565b9150612e8082612e19565b604082019050919050565b60006020820190508181036000830152612ea481612e68565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612f07602483612542565b9150612f1282612eab565b604082019050919050565b60006020820190508181036000830152612f3681612efa565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f99602283612542565b9150612fa482612f3d565b604082019050919050565b60006020820190508181036000830152612fc881612f8c565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061302b602183612542565b915061303682612fcf565b604082019050919050565b6000602082019050818103600083015261305a8161301e565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006130bd602283612542565b91506130c882613061565b604082019050919050565b600060208201905081810360008301526130ec816130b0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613129601d83612542565b9150613134826130f3565b602082019050919050565b600060208201905081810360008301526131588161311c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006131bb602583612542565b91506131c68261315f565b604082019050919050565b600060208201905081810360008301526131ea816131ae565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061324d602383612542565b9150613258826131f1565b604082019050919050565b6000602082019050818103600083015261327c81613240565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006132df602683612542565b91506132ea82613283565b604082019050919050565b6000602082019050818103600083015261330e816132d2565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061334b601f83612542565b915061335682613315565b602082019050919050565b6000602082019050818103600083015261337a8161333e565b9050919050565b60006060820190506133966000830186612891565b6133a36020830185612891565b6133b06040830184612676565b949350505050565b60006133c3826124a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133f5576133f4612c00565b5b600182019050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613441601783613400565b915061344c8261340b565b601782019050919050565b600061346282612537565b61346c8185613400565b935061347c818560208601612553565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006134be601183613400565b91506134c982613488565b601182019050919050565b60006134df82613434565b91506134eb8285613457565b91506134f6826134b1565b91506135028284613457565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613544601483612542565b915061354f8261350e565b602082019050919050565b6000602082019050818103600083015261357381613537565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006135b0601083612542565b91506135bb8261357a565b602082019050919050565b600060208201905081810360008301526135df816135a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000613671602a83612542565b915061367c82613615565b604082019050919050565b600060208201905081810360008301526136a081613664565b9050919050565b60006136b2826124a5565b91506136bd836124a5565b92508282026136cb816124a5565b915082820484148315176136e2576136e1612c00565b5b5092915050565b60006136f4826124a5565b91506000820361370757613706612c00565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613748602083612542565b915061375382613712565b602082019050919050565b600060208201905081810360008301526137778161373b565b9050919050565b6000613789826124a5565b9150613794836124a5565b92508282039050818111156137ac576137ab612c00565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220a22989a3c73ef2895da365d02b7572bb6f24e425e460a1a2078ba8e18b66baf564736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806342966c681161010f578063a217fddf116100a2578063d539139311610071578063d5391393146105b9578063d547741f146105d7578063dd62ed3e146105f3578063e63ab1e914610623576101f0565b8063a217fddf1461050b578063a457c2d714610529578063a9059cbb14610559578063ca15c87314610589576101f0565b80638456cb59116100de5780638456cb59146104835780639010d07c1461048d57806391d14854146104bd57806395d89b41146104ed576101f0565b806342966c68146103fd5780635c975abb1461041957806370a082311461043757806379cc679014610467576101f0565b8063282c51f31161018757806336568abe1161015657806336568abe1461038b57806339509351146103a75780633f4ba83a146103d757806340c10f19146103e1576101f0565b8063282c51f3146103295780632c0503d4146103475780632f2ff15d14610351578063313ce5671461036d576101f0565b806318160ddd116101c357806318160ddd1461028f5780631cf2c7e2146102ad57806323b872dd146102c9578063248a9ca3146102f9576101f0565b806301ffc9a7146101f557806303f24de11461022557806306fdde0314610241578063095ea7b31461025f575b600080fd5b61020f600480360381019061020a91906122fc565b610641565b60405161021c9190612344565b60405180910390f35b61023f600480360381019061023a91906124db565b6106bb565b005b610249610786565b60405161025691906125b6565b60405180910390f35b61027960048036038101906102749190612636565b610818565b6040516102869190612344565b60405180910390f35b61029761083b565b6040516102a49190612685565b60405180910390f35b6102c760048036038101906102c29190612636565b610845565b005b6102e360048036038101906102de91906126a0565b6108c3565b6040516102f09190612344565b60405180910390f35b610313600480360381019061030e9190612729565b6108f2565b6040516103209190612765565b60405180910390f35b610331610911565b60405161033e9190612765565b60405180910390f35b61034f610935565b005b61036b60048036038101906103669190612780565b6109bb565b005b6103756109dc565b60405161038291906127dc565b60405180910390f35b6103a560048036038101906103a09190612780565b6109f3565b005b6103c160048036038101906103bc9190612636565b610a76565b6040516103ce9190612344565b60405180910390f35b6103df610aad565b005b6103fb60048036038101906103f69190612636565b610b27565b005b610417600480360381019061041291906127f7565b610ba5565b005b610421610bb9565b60405161042e9190612344565b60405180910390f35b610451600480360381019061044c9190612824565b610bd0565b60405161045e9190612685565b60405180910390f35b610481600480360381019061047c9190612636565b610c19565b005b61048b610c39565b005b6104a760048036038101906104a29190612851565b610cb3565b6040516104b491906128a0565b60405180910390f35b6104d760048036038101906104d29190612780565b610ce2565b6040516104e49190612344565b60405180910390f35b6104f5610d4c565b60405161050291906125b6565b60405180910390f35b610513610dde565b6040516105209190612765565b60405180910390f35b610543600480360381019061053e9190612636565b610de5565b6040516105509190612344565b60405180910390f35b610573600480360381019061056e9190612636565b610e5c565b6040516105809190612344565b60405180910390f35b6105a3600480360381019061059e9190612729565b610e7f565b6040516105b09190612685565b60405180910390f35b6105c1610ea3565b6040516105ce9190612765565b60405180910390f35b6105f160048036038101906105ec9190612780565b610ec7565b005b61060d600480360381019061060891906128bb565b610ee8565b60405161061a9190612685565b60405180910390f35b61062b610f6f565b6040516106389190612765565b60405180910390f35b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b457506106b382610f93565b5b9050919050565b600061080073ffffffffffffffffffffffffffffffffffffffff166353266bbb3085856040518463ffffffff1660e01b81526004016106fc939291906128fb565b6020604051808303816000875af115801561071b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073f9190612965565b905080610781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610778906129de565b60405180910390fd5b505050565b60606005805461079590612a2d565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190612a2d565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905090565b60008061082361100d565b9050610830818585611015565b600191505092915050565b6000600454905090565b6108767f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84861087161100d565b610ce2565b6108b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ac90612ad0565b60405180910390fd5b6108bf82826111de565b5050565b6000806108ce61100d565b90506108db8582856113ad565b6108e6858585611439565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61080173ffffffffffffffffffffffffffffffffffffffff16632efe8a5f3060646040518363ffffffff1660e01b8152600401610973929190612b45565b6020604051808303816000875af1158015610992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b69190612965565b600080fd5b6109c4826108f2565b6109cd816116b2565b6109d783836116c6565b505050565b6000600760019054906101000a900460ff16905090565b6109fb61100d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f90612be0565b60405180910390fd5b610a7282826116fa565b5050565b600080610a8161100d565b9050610aa2818585610a938589610ee8565b610a9d9190612c2f565b611015565b600191505092915050565b610ade7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ad961100d565b610ce2565b610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1490612cd5565b60405180910390fd5b610b2561172e565b565b610b587f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610b5361100d565b610ce2565b610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e90612d67565b60405180910390fd5b610ba18282611791565b5050565b610bb6610bb061100d565b826111de565b50565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c2b82610c2561100d565b836113ad565b610c3582826111de565b5050565b610c6a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c6561100d565b610ce2565b610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca090612df9565b60405180910390fd5b610cb16118e8565b565b6000610cda826001600086815260200190815260200160002061194b90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610d5b90612a2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8790612a2d565b8015610dd45780601f10610da957610100808354040283529160200191610dd4565b820191906000526020600020905b815481529060010190602001808311610db757829003601f168201915b5050505050905090565b6000801b81565b600080610df061100d565b90506000610dfe8286610ee8565b905083811015610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90612e8b565b60405180910390fd5b610e508286868403611015565b60019250505092915050565b600080610e6761100d565b9050610e74818585611439565b600191505092915050565b6000610e9c60016000848152602001908152602001600020611965565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610ed0826108f2565b610ed9816116b2565b610ee383836116fa565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061100657506110058261197a565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107b90612f1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90612faf565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111d19190612685565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124490613041565b60405180910390fd5b611259826000836119e4565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906130d3565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113949190612685565b60405180910390a36113a883600084611aa9565b505050565b60006113b98484610ee8565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114335781811015611425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141c9061313f565b60405180910390fd5b6114328484848403611015565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f906131d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150e90613263565b60405180910390fd5b6115228383836119e4565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a0906132f5565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116999190612685565b60405180910390a36116ac848484611aa9565b50505050565b6116c3816116be61100d565b611aae565b50565b6116d08282611b33565b6116f58160016000858152602001908152602001600020611c1390919063ffffffff16565b505050565b6117048282611c43565b6117298160016000858152602001908152602001600020611d2490919063ffffffff16565b505050565b611736611d54565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61177a61100d565b60405161178791906128a0565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613361565b60405180910390fd5b61180c600083836119e4565b806004600082825461181e9190612c2f565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118d09190612685565b60405180910390a36118e460008383611aa9565b5050565b6118f0611d9d565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861193461100d565b60405161194191906128a0565b60405180910390a1565b600061195a8360000183611de7565b60001c905092915050565b600061197382600001611e12565b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b7f6a7461657441bf111caa502b48bec73847d91c1265dc315d914c2d2a6c95fcfe838383604051611a1793929190613381565b60405180910390a160005b6005811015611a98573073ffffffffffffffffffffffffffffffffffffffff16632c0503d46040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a7357600080fd5b505af1925050508015611a84575060015b508080611a90906133b8565b915050611a22565b50611aa4838383611e23565b505050565b505050565b611ab88282610ce2565b611b2f57611ac581611e7b565b611ad38360001c6020611ea8565b604051602001611ae49291906134d4565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2691906125b6565b60405180910390fd5b5050565b611b3d8282610ce2565b611c0f57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bb461100d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611c3b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6120e4565b905092915050565b611c4d8282610ce2565b15611d2057600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611cc561100d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611d4c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612154565b905092915050565b611d5c610bb9565b611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d929061355a565b60405180910390fd5b565b611da5610bb9565b15611de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddc906135c6565b60405180910390fd5b565b6000826000018281548110611dff57611dfe6135e6565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b611e2e838383612268565b611e36610bb9565b15611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d90613687565b60405180910390fd5b505050565b6060611ea18273ffffffffffffffffffffffffffffffffffffffff16601460ff16611ea8565b9050919050565b606060006002836002611ebb91906136a7565b611ec59190612c2f565b67ffffffffffffffff811115611ede57611edd61237a565b5b6040519080825280601f01601f191660200182016040528015611f105781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611f4857611f476135e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611fac57611fab6135e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611fec91906136a7565b611ff69190612c2f565b90505b6001811115612096577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612038576120376135e6565b5b1a60f81b82828151811061204f5761204e6135e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061208f906136e9565b9050611ff9565b50600084146120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d19061375e565b60405180910390fd5b8091505092915050565b60006120f0838361226d565b61214957826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061214e565b600090505b92915050565b6000808360010160008481526020019081526020016000205490506000811461225c576000600182612186919061377e565b905060006001866000018054905061219e919061377e565b905081811461220d5760008660000182815481106121bf576121be6135e6565b5b90600052602060002001549050808760000184815481106121e3576121e26135e6565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612221576122206137b2565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612262565b60009150505b92915050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122d9816122a4565b81146122e457600080fd5b50565b6000813590506122f6816122d0565b92915050565b6000602082840312156123125761231161229a565b5b6000612320848285016122e7565b91505092915050565b60008115159050919050565b61233e81612329565b82525050565b60006020820190506123596000830184612335565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123b282612369565b810181811067ffffffffffffffff821117156123d1576123d061237a565b5b80604052505050565b60006123e4612290565b90506123f082826123a9565b919050565b600067ffffffffffffffff8211156124105761240f61237a565b5b61241982612369565b9050602081019050919050565b82818337600083830152505050565b6000612448612443846123f5565b6123da565b90508281526020810184848401111561246457612463612364565b5b61246f848285612426565b509392505050565b600082601f83011261248c5761248b61235f565b5b813561249c848260208601612435565b91505092915050565b6000819050919050565b6124b8816124a5565b81146124c357600080fd5b50565b6000813590506124d5816124af565b92915050565b600080604083850312156124f2576124f161229a565b5b600083013567ffffffffffffffff8111156125105761250f61229f565b5b61251c85828601612477565b925050602061252d858286016124c6565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612571578082015181840152602081019050612556565b60008484015250505050565b600061258882612537565b6125928185612542565b93506125a2818560208601612553565b6125ab81612369565b840191505092915050565b600060208201905081810360008301526125d0818461257d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612603826125d8565b9050919050565b612613816125f8565b811461261e57600080fd5b50565b6000813590506126308161260a565b92915050565b6000806040838503121561264d5761264c61229a565b5b600061265b85828601612621565b925050602061266c858286016124c6565b9150509250929050565b61267f816124a5565b82525050565b600060208201905061269a6000830184612676565b92915050565b6000806000606084860312156126b9576126b861229a565b5b60006126c786828701612621565b93505060206126d886828701612621565b92505060406126e9868287016124c6565b9150509250925092565b6000819050919050565b612706816126f3565b811461271157600080fd5b50565b600081359050612723816126fd565b92915050565b60006020828403121561273f5761273e61229a565b5b600061274d84828501612714565b91505092915050565b61275f816126f3565b82525050565b600060208201905061277a6000830184612756565b92915050565b600080604083850312156127975761279661229a565b5b60006127a585828601612714565b92505060206127b685828601612621565b9150509250929050565b600060ff82169050919050565b6127d6816127c0565b82525050565b60006020820190506127f160008301846127cd565b92915050565b60006020828403121561280d5761280c61229a565b5b600061281b848285016124c6565b91505092915050565b60006020828403121561283a5761283961229a565b5b600061284884828501612621565b91505092915050565b600080604083850312156128685761286761229a565b5b600061287685828601612714565b9250506020612887858286016124c6565b9150509250929050565b61289a816125f8565b82525050565b60006020820190506128b56000830184612891565b92915050565b600080604083850312156128d2576128d161229a565b5b60006128e085828601612621565b92505060206128f185828601612621565b9150509250929050565b60006060820190506129106000830186612891565b8181036020830152612922818561257d565b90506129316040830184612676565b949350505050565b61294281612329565b811461294d57600080fd5b50565b60008151905061295f81612939565b92915050565b60006020828403121561297b5761297a61229a565b5b600061298984828501612950565b91505092915050565b7f6661696c656420746f207374616b650000000000000000000000000000000000600082015250565b60006129c8600f83612542565b91506129d382612992565b602082019050919050565b600060208201905081810360008301526129f7816129bb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a4557607f821691505b602082108103612a5857612a576129fe565b5b50919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206275726e657220726f6c6520746f206275726e0000000000000000602082015250565b6000612aba603883612542565b9150612ac582612a5e565b604082019050919050565b60006020820190508181036000830152612ae981612aad565b9050919050565b6000819050919050565b600063ffffffff82169050919050565b6000819050919050565b6000612b2f612b2a612b2584612af0565b612b0a565b612afa565b9050919050565b612b3f81612b14565b82525050565b6000604082019050612b5a6000830185612891565b612b676020830184612b36565b9392505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612bca602f83612542565b9150612bd582612b6e565b604082019050919050565b60006020820190508181036000830152612bf981612bbd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c3a826124a5565b9150612c45836124a5565b9250828201905080821115612c5d57612c5c612c00565b5b92915050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b6000612cbf603b83612542565b9150612cca82612c63565b604082019050919050565b60006020820190508181036000830152612cee81612cb2565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b6000612d51603883612542565b9150612d5c82612cf5565b604082019050919050565b60006020820190508181036000830152612d8081612d44565b9050919050565b7f45524332304d696e7465724275726e6572446563696d616c733a206d7573742060008201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b6000612de3603983612542565b9150612dee82612d87565b604082019050919050565b60006020820190508181036000830152612e1281612dd6565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e75602583612542565b9150612e8082612e19565b604082019050919050565b60006020820190508181036000830152612ea481612e68565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612f07602483612542565b9150612f1282612eab565b604082019050919050565b60006020820190508181036000830152612f3681612efa565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f99602283612542565b9150612fa482612f3d565b604082019050919050565b60006020820190508181036000830152612fc881612f8c565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061302b602183612542565b915061303682612fcf565b604082019050919050565b6000602082019050818103600083015261305a8161301e565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006130bd602283612542565b91506130c882613061565b604082019050919050565b600060208201905081810360008301526130ec816130b0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613129601d83612542565b9150613134826130f3565b602082019050919050565b600060208201905081810360008301526131588161311c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006131bb602583612542565b91506131c68261315f565b604082019050919050565b600060208201905081810360008301526131ea816131ae565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061324d602383612542565b9150613258826131f1565b604082019050919050565b6000602082019050818103600083015261327c81613240565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006132df602683612542565b91506132ea82613283565b604082019050919050565b6000602082019050818103600083015261330e816132d2565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061334b601f83612542565b915061335682613315565b602082019050919050565b6000602082019050818103600083015261337a8161333e565b9050919050565b60006060820190506133966000830186612891565b6133a36020830185612891565b6133b06040830184612676565b949350505050565b60006133c3826124a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133f5576133f4612c00565b5b600182019050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613441601783613400565b915061344c8261340b565b601782019050919050565b600061346282612537565b61346c8185613400565b935061347c818560208601612553565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006134be601183613400565b91506134c982613488565b601182019050919050565b60006134df82613434565b91506134eb8285613457565b91506134f6826134b1565b91506135028284613457565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613544601483612542565b915061354f8261350e565b602082019050919050565b6000602082019050818103600083015261357381613537565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006135b0601083612542565b91506135bb8261357a565b602082019050919050565b600060208201905081810360008301526135df816135a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000613671602a83612542565b915061367c82613615565b604082019050919050565b600060208201905081810360008301526136a081613664565b9050919050565b60006136b2826124a5565b91506136bd836124a5565b92508282026136cb816124a5565b915082820484148315176136e2576136e1612c00565b5b5092915050565b60006136f4826124a5565b91506000820361370757613706612c00565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613748602083612542565b915061375382613712565b602082019050919050565b600060208201905081810360008301526137778161373b565b9050919050565b6000613789826124a5565b9150613794836124a5565b92508282039050818111156137ac576137ab612c00565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220a22989a3c73ef2895da365d02b7572bb6f24e425e460a1a2078ba8e18b66baf564736f6c63430008140033", + "bytecode": "0x60806040523461046e57611dd58038038061001981610472565b92833981019060608183031261046e5780516001600160401b03811161046e5782610045918301610497565b60208201519092906001600160401b03811161046e57604091610069918401610497565b91015160ff8116810361046e5782516001600160401b03811161039c57600554600181811c91168015610464575b602082101461037e57601f811161041e575b506020601f82116001146103bb57819293945f926103b0575b50508160011b915f199060031b1c1916176005555b81516001600160401b03811161039c57600654600181811c91168015610392575b602082101461037e57601f811161031b575b50602092601f82116001146102ba57928192935f926102af575b50508160011b915f199060031b1c1916176006555b610142336104e8565b610277575b6101503361055e565b610232575b61015e336105de565b6101ed575b61016c3361065e565b610195575b61ff006007549160081b169061ff0019161760075560405161159390816107628239f35b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8485f5260016020526101e7337f4796a5437e25bdc491b74d328cf6b437c8587e216f52049c7df56421f51ae30f6106f1565b50610171565b5f80516020611d558339815191525f52600160205261022c337fb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a86106f1565b50610163565b5f80516020611d758339815191525f526001602052610271337f64e21244e91af723e1b962171ed4828dcecc0d7b89872e516a5db8266da800006106f1565b50610155565b5f805260016020526102a9337fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb496106f1565b50610147565b015190505f80610124565b601f1982169360065f52805f20915f5b86811061030357508360019596106102eb575b505050811b01600655610139565b01515f1960f88460031b161c191690555f80806102dd565b919260206001819286850151815501940192016102ca565b60065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f601f830160051c81019160208410610374575b601f0160051c01905b818110610369575061010a565b5f815560010161035c565b9091508190610353565b634e487b7160e01b5f52602260045260245ffd5b90607f16906100f8565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100c2565b601f1982169060055f52805f20915f5b818110610406575095836001959697106103ee575b505050811b016005556100d7565b01515f1960f88460031b161c191690555f80806103e0565b9192602060018192868b0151815501940192016103cb565b60055f5260205f20601f830160051c8101916020841061045a575b601f0160051c01905b81811061044f57506100a9565b5f8155600101610442565b9091508190610439565b90607f1690610097565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761039c57604052565b81601f8201121561046e578051906001600160401b03821161039c576104c6601f8301601f1916602001610472565b928284526020838301011161046e57815f9260208093018386015e8301015290565b6001600160a01b0381165f9081525f80516020611db5833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611db583398151915260205260408120805460ff191660011790553391905f80516020611cf58339815191528180a4600190565b505f90565b6001600160a01b0381165f9081525f80516020611d15833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611d1583398151915260205260408120805460ff191660011790553391905f80516020611d75833981519152905f80516020611cf58339815191529080a4600190565b6001600160a01b0381165f9081525f80516020611d35833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611d3583398151915260205260408120805460ff191660011790553391905f80516020611d55833981519152905f80516020611cf58339815191529080a4600190565b6001600160a01b0381165f9081525f80516020611d95833981519152602052604090205460ff16610559576001600160a01b03165f8181525f80516020611d9583398151915260205260408120805460ff191660011790553391907f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848905f80516020611cf58339815191529080a4600190565b6001810190825f528160205260405f2054155f1461075a5780546801000000000000000081101561039c5760018101808355811015610746578390825f5260205f20015554915f5260205260405f2055600190565b634e487b7160e01b5f52603260045260245ffd5b5050505f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610e835750806303f24de114610d4d57806306fdde0314610c92578063095ea7b314610bea57806318160ddd14610bcd5780631cf2c7e214610b1e57806323b872dd14610ae6578063248a9ca314610ab4578063282c51f314610a7a5780632c0503d414610a035780632f2ff15d1461099e578063313ce5671461097b57806336568abe146109375780633f4ba83a1461084b57806340c10f19146106bc57806342966c681461069f5780635c975abb1461067d57806370a082311461064557806379cc6790146106155780638456cb591461053a5780639010d07c146104f557806391d14854146104ad57806395d89b41146103a1578063a217fddf14610387578063a3246ad3146102d8578063a9059cbb146102a7578063ca15c8731461027d578063d539139314610243578063d547741f146101ff578063dd62ed3e146101af5763e63ab1e914610171575f80fd5b346101ab575f3660031901126101ab5760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5f80fd5b346101ab5760403660031901126101ab576101c8610f36565b6101d0610f4c565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b346101ab5760403660031901126101ab5761024160043561021e610f4c565b9061023c610237825f525f602052600160405f20015490565b611210565b611248565b005b346101ab575f3660031901126101ab5760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b346101ab5760203660031901126101ab576004355f526001602052602060405f2054604051908152f35b346101ab5760403660031901126101ab576102cd6102c3610f36565b6024359033611116565b602060405160018152f35b346101ab5760203660031901126101ab576004355f52600160205260405f20604051806020835491828152019081935f5260205f20905f5b8181106103715750505081610326910382610ef0565b604051918291602083019060208452518091526040830191905f5b81811061034f575050500390f35b82516001600160a01b0316845285945060209384019390920191600101610341565b8254845260209093019260019283019201610310565b346101ab575f3660031901126101ab5760206040515f8152f35b346101ab575f3660031901126101ab576040515f6006548060011c906001811680156104a3575b60208310811461048f5782855290811561046b575060011461040d575b610409836103f581850382610ef0565b604051918291602083526020830190610f12565b0390f35b60065f9081527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939250905b808210610451575090915081016020016103f56103e5565b919260018160209254838588010152019101909291610439565b60ff191660208086019190915291151560051b840190910191506103f590506103e5565b634e487b7160e01b5f52602260045260245ffd5b91607f16916103c8565b346101ab5760403660031901126101ab576104c6610f4c565b6004355f525f60205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346101ab5760403660031901126101ab576004355f526001602052602061052160243560405f206113a5565b905460405160039290921b1c6001600160a01b03168152f35b346101ab575f3660031901126101ab57335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156105c15761058861138a565b600160ff1960075416176007557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b60405162461bcd60e51b815260206004820152603960248201525f8051602061153e833981519152604482015278686176652070617573657220726f6c6520746f20706175736560381b6064820152608490fd5b346101ab5760403660031901126101ab57610241610631610f36565b60243590610640823383611073565b610f7a565b346101ab5760203660031901126101ab576001600160a01b03610666610f36565b165f526002602052602060405f2054604051908152f35b346101ab575f3660031901126101ab57602060ff600754166040519015158152f35b346101ab5760203660031901126101ab5761024160043533610f7a565b346101ab5760403660031901126101ab576106d5610f36565b335f9081527f0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c6020526040902054602435919060ff16156107f8576001600160a01b03169081156107e5575f805160206114fe83398151915260606040515f8152846020820152836040820152a15f5b600581106107a8575061075661138a565b600454908082018092116107945760205f8051602061151e833981519152915f936004558484526002825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b303b156101ab57604051630b0140f560e21b8152600191905f8160048183305af16107d5575b5001610745565b5f6107df91610ef0565b846107ce565b63ec442f0560e01b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152603860248201525f8051602061153e8339815191526044820152771a185d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60421b6064820152608490fd5b346101ab575f3660031901126101ab57335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156108df5760075460ff8116156108d05760ff19166007557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152603b60248201525f8051602061153e83398151915260448201527f686176652070617573657220726f6c6520746f20756e706175736500000000006064820152608490fd5b346101ab5760403660031901126101ab57610950610f4c565b336001600160a01b0382160361096c5761024190600435611248565b63334bd91960e11b5f5260045ffd5b346101ab575f3660031901126101ab57602060ff60075460081c16604051908152f35b346101ab5760403660031901126101ab576004356109ba610f4c565b6109d2610237835f525f602052600160405f20015490565b6109dc8183611282565b6109e257005b5f91825260016020526040909120610241916001600160a01b0316906113ce565b346101ab575f3660031901126101ab57604051632efe8a5f60e01b8152306004820152606460248201526020816044815f6108015af18015610a6f57610a47575f80fd5b6101ab9060203d602011610a68575b610a608183610ef0565b810190610f62565b503d610a56565b6040513d5f823e3d90fd5b346101ab575f3660031901126101ab5760206040517f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8488152f35b346101ab5760203660031901126101ab576020610ade6004355f525f602052600160405f20015490565b604051908152f35b346101ab5760603660031901126101ab576102cd610b02610f36565b610b0a610f4c565b60443591610b19833383611073565b611116565b346101ab5760403660031901126101ab57610b37610f36565b335f9081527f6bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870ae602052604090205460ff1615610b7a576102419060243590610f7a565b60405162461bcd60e51b815260206004820152603860248201525f8051602061153e8339815191526044820152773430bb3290313ab93732b9103937b632903a3790313ab93760411b6064820152608490fd5b346101ab575f3660031901126101ab576020600454604051908152f35b346101ab5760403660031901126101ab57610c03610f36565b602435903315610c7f576001600160a01b0316908115610c6c57335f52600360205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346101ab575f3660031901126101ab576040515f6005548060011c90600181168015610d43575b60208310811461048f5782855290811561046b5750600114610ce557610409836103f581850382610ef0565b60055f9081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0939250905b808210610d29575090915081016020016103f56103e5565b919260018160209254838588010152019101909291610d11565b91607f1691610cb9565b346101ab5760403660031901126101ab5760043567ffffffffffffffff81116101ab57366023820112156101ab5780600401359067ffffffffffffffff8211610e6f57604051610da7601f8401601f191660200182610ef0565b82815236602484840101116101ab575f602084610df39560248396018386013783010152604051809381926353266bbb60e01b8352306004840152606060248401526064830190610f12565b602435604483015203815f6108005af1908115610a6f575f91610e50575b5015610e1957005b60405162461bcd60e51b815260206004820152600f60248201526e6661696c656420746f207374616b6560881b6044820152606490fd5b610e69915060203d602011610a6857610a608183610ef0565b81610e11565b634e487b7160e01b5f52604160045260245ffd5b346101ab5760203660031901126101ab576004359063ffffffff60e01b82168092036101ab57602091635a05180f60e01b8114908115610ec5575b5015158152f35b637965db0b60e01b811491508115610edf575b5083610ebe565b6301ffc9a760e01b14905083610ed8565b90601f8019910116810190811067ffffffffffffffff821117610e6f57604052565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101ab57565b602435906001600160a01b03821682036101ab57565b908160209103126101ab575180151581036101ab5790565b9091906001600160a01b03168015611060575f805160206114fe83398151915260606040518381525f6020820152856040820152a15f5b600581106110235750610fc261138a565b805f52600260205260405f2054838110611009576020845f94955f8051602061151e83398151915293858752600284520360408620558060045403600455604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b303b156101ab57604051630b0140f560e21b8152600191905f8160048183305af1611050575b5001610fb1565b5f61105a91610ef0565b5f611049565b634b637e8f60e11b5f525f60045260245ffd5b6001600160a01b039081165f818152600360209081526040808320948616835293905291909120549291905f1984106110ad575b50505050565b8284106110f3578015610c7f576001600160a01b03821615610c6c575f52600360205260405f209060018060a01b03165f5260205260405f20910390555f8080806110a7565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115611060576001600160a01b03169182156107e5575f805160206114fe8339815191526060604051848152856020820152836040820152a15f5b600581106111d3575061116c61138a565b815f52600260205260405f20548181106111ba57815f8051602061151e83398151915292602092855f52600284520360405f2055845f526002825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b303b156101ab57604051630b0140f560e21b8152600191905f8160048183305af1611200575b500161115b565b5f61120a91610ef0565b5f6111f9565b5f8181526020818152604080832033845290915290205460ff16156112325750565b63e2517d3f60e01b5f523360045260245260445ffd5b611252828261130a565b918261125d57505090565b5f9182526001602052604090912061127e916001600160a01b031690611438565b5090565b5f818152602081815260408083206001600160a01b038616845290915290205460ff16611304575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615611304575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b60ff6007541661139657565b63d93c066560e01b5f5260045ffd5b80548210156113ba575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6001810190825f528160205260405f2054155f14611431578054600160401b811015610e6f5761141e6114088260018794018555846113a5565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b906001820191815f528260205260405f20548015155f146114f5575f1981018181116107945782545f19810191908211610794578181036114c0575b505050805480156114ac575f19019061148d82826113a5565b8154905f199060031b1b19169055555f526020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b6114e06114d061140893866113a5565b90549060031b1c928392866113a5565b90555f528360205260405f20555f8080611474565b505050505f9056fe6a7461657441bf111caa502b48bec73847d91c1265dc315d914c2d2a6c95fcfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332304d696e7465724275726e6572446563696d616c733a206d75737420a2646970667358221220353a43254c86d9e67d45b076cab720a9189a3d0d90765b79bd28ddafa2f3e03a64736f6c634300081a00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6cf7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870aead3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610e835750806303f24de114610d4d57806306fdde0314610c92578063095ea7b314610bea57806318160ddd14610bcd5780631cf2c7e214610b1e57806323b872dd14610ae6578063248a9ca314610ab4578063282c51f314610a7a5780632c0503d414610a035780632f2ff15d1461099e578063313ce5671461097b57806336568abe146109375780633f4ba83a1461084b57806340c10f19146106bc57806342966c681461069f5780635c975abb1461067d57806370a082311461064557806379cc6790146106155780638456cb591461053a5780639010d07c146104f557806391d14854146104ad57806395d89b41146103a1578063a217fddf14610387578063a3246ad3146102d8578063a9059cbb146102a7578063ca15c8731461027d578063d539139314610243578063d547741f146101ff578063dd62ed3e146101af5763e63ab1e914610171575f80fd5b346101ab575f3660031901126101ab5760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5f80fd5b346101ab5760403660031901126101ab576101c8610f36565b6101d0610f4c565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b346101ab5760403660031901126101ab5761024160043561021e610f4c565b9061023c610237825f525f602052600160405f20015490565b611210565b611248565b005b346101ab575f3660031901126101ab5760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b346101ab5760203660031901126101ab576004355f526001602052602060405f2054604051908152f35b346101ab5760403660031901126101ab576102cd6102c3610f36565b6024359033611116565b602060405160018152f35b346101ab5760203660031901126101ab576004355f52600160205260405f20604051806020835491828152019081935f5260205f20905f5b8181106103715750505081610326910382610ef0565b604051918291602083019060208452518091526040830191905f5b81811061034f575050500390f35b82516001600160a01b0316845285945060209384019390920191600101610341565b8254845260209093019260019283019201610310565b346101ab575f3660031901126101ab5760206040515f8152f35b346101ab575f3660031901126101ab576040515f6006548060011c906001811680156104a3575b60208310811461048f5782855290811561046b575060011461040d575b610409836103f581850382610ef0565b604051918291602083526020830190610f12565b0390f35b60065f9081527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939250905b808210610451575090915081016020016103f56103e5565b919260018160209254838588010152019101909291610439565b60ff191660208086019190915291151560051b840190910191506103f590506103e5565b634e487b7160e01b5f52602260045260245ffd5b91607f16916103c8565b346101ab5760403660031901126101ab576104c6610f4c565b6004355f525f60205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346101ab5760403660031901126101ab576004355f526001602052602061052160243560405f206113a5565b905460405160039290921b1c6001600160a01b03168152f35b346101ab575f3660031901126101ab57335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156105c15761058861138a565b600160ff1960075416176007557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b60405162461bcd60e51b815260206004820152603960248201525f8051602061153e833981519152604482015278686176652070617573657220726f6c6520746f20706175736560381b6064820152608490fd5b346101ab5760403660031901126101ab57610241610631610f36565b60243590610640823383611073565b610f7a565b346101ab5760203660031901126101ab576001600160a01b03610666610f36565b165f526002602052602060405f2054604051908152f35b346101ab575f3660031901126101ab57602060ff600754166040519015158152f35b346101ab5760203660031901126101ab5761024160043533610f7a565b346101ab5760403660031901126101ab576106d5610f36565b335f9081527f0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c6020526040902054602435919060ff16156107f8576001600160a01b03169081156107e5575f805160206114fe83398151915260606040515f8152846020820152836040820152a15f5b600581106107a8575061075661138a565b600454908082018092116107945760205f8051602061151e833981519152915f936004558484526002825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b303b156101ab57604051630b0140f560e21b8152600191905f8160048183305af16107d5575b5001610745565b5f6107df91610ef0565b846107ce565b63ec442f0560e01b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152603860248201525f8051602061153e8339815191526044820152771a185d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60421b6064820152608490fd5b346101ab575f3660031901126101ab57335f9081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16156108df5760075460ff8116156108d05760ff19166007557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152603b60248201525f8051602061153e83398151915260448201527f686176652070617573657220726f6c6520746f20756e706175736500000000006064820152608490fd5b346101ab5760403660031901126101ab57610950610f4c565b336001600160a01b0382160361096c5761024190600435611248565b63334bd91960e11b5f5260045ffd5b346101ab575f3660031901126101ab57602060ff60075460081c16604051908152f35b346101ab5760403660031901126101ab576004356109ba610f4c565b6109d2610237835f525f602052600160405f20015490565b6109dc8183611282565b6109e257005b5f91825260016020526040909120610241916001600160a01b0316906113ce565b346101ab575f3660031901126101ab57604051632efe8a5f60e01b8152306004820152606460248201526020816044815f6108015af18015610a6f57610a47575f80fd5b6101ab9060203d602011610a68575b610a608183610ef0565b810190610f62565b503d610a56565b6040513d5f823e3d90fd5b346101ab575f3660031901126101ab5760206040517f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8488152f35b346101ab5760203660031901126101ab576020610ade6004355f525f602052600160405f20015490565b604051908152f35b346101ab5760603660031901126101ab576102cd610b02610f36565b610b0a610f4c565b60443591610b19833383611073565b611116565b346101ab5760403660031901126101ab57610b37610f36565b335f9081527f6bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870ae602052604090205460ff1615610b7a576102419060243590610f7a565b60405162461bcd60e51b815260206004820152603860248201525f8051602061153e8339815191526044820152773430bb3290313ab93732b9103937b632903a3790313ab93760411b6064820152608490fd5b346101ab575f3660031901126101ab576020600454604051908152f35b346101ab5760403660031901126101ab57610c03610f36565b602435903315610c7f576001600160a01b0316908115610c6c57335f52600360205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346101ab575f3660031901126101ab576040515f6005548060011c90600181168015610d43575b60208310811461048f5782855290811561046b5750600114610ce557610409836103f581850382610ef0565b60055f9081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0939250905b808210610d29575090915081016020016103f56103e5565b919260018160209254838588010152019101909291610d11565b91607f1691610cb9565b346101ab5760403660031901126101ab5760043567ffffffffffffffff81116101ab57366023820112156101ab5780600401359067ffffffffffffffff8211610e6f57604051610da7601f8401601f191660200182610ef0565b82815236602484840101116101ab575f602084610df39560248396018386013783010152604051809381926353266bbb60e01b8352306004840152606060248401526064830190610f12565b602435604483015203815f6108005af1908115610a6f575f91610e50575b5015610e1957005b60405162461bcd60e51b815260206004820152600f60248201526e6661696c656420746f207374616b6560881b6044820152606490fd5b610e69915060203d602011610a6857610a608183610ef0565b81610e11565b634e487b7160e01b5f52604160045260245ffd5b346101ab5760203660031901126101ab576004359063ffffffff60e01b82168092036101ab57602091635a05180f60e01b8114908115610ec5575b5015158152f35b637965db0b60e01b811491508115610edf575b5083610ebe565b6301ffc9a760e01b14905083610ed8565b90601f8019910116810190811067ffffffffffffffff821117610e6f57604052565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101ab57565b602435906001600160a01b03821682036101ab57565b908160209103126101ab575180151581036101ab5790565b9091906001600160a01b03168015611060575f805160206114fe83398151915260606040518381525f6020820152856040820152a15f5b600581106110235750610fc261138a565b805f52600260205260405f2054838110611009576020845f94955f8051602061151e83398151915293858752600284520360408620558060045403600455604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b303b156101ab57604051630b0140f560e21b8152600191905f8160048183305af1611050575b5001610fb1565b5f61105a91610ef0565b5f611049565b634b637e8f60e11b5f525f60045260245ffd5b6001600160a01b039081165f818152600360209081526040808320948616835293905291909120549291905f1984106110ad575b50505050565b8284106110f3578015610c7f576001600160a01b03821615610c6c575f52600360205260405f209060018060a01b03165f5260205260405f20910390555f8080806110a7565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115611060576001600160a01b03169182156107e5575f805160206114fe8339815191526060604051848152856020820152836040820152a15f5b600581106111d3575061116c61138a565b815f52600260205260405f20548181106111ba57815f8051602061151e83398151915292602092855f52600284520360405f2055845f526002825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b303b156101ab57604051630b0140f560e21b8152600191905f8160048183305af1611200575b500161115b565b5f61120a91610ef0565b5f6111f9565b5f8181526020818152604080832033845290915290205460ff16156112325750565b63e2517d3f60e01b5f523360045260245260445ffd5b611252828261130a565b918261125d57505090565b5f9182526001602052604090912061127e916001600160a01b031690611438565b5090565b5f818152602081815260408083206001600160a01b038616845290915290205460ff16611304575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615611304575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b60ff6007541661139657565b63d93c066560e01b5f5260045ffd5b80548210156113ba575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6001810190825f528160205260405f2054155f14611431578054600160401b811015610e6f5761141e6114088260018794018555846113a5565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b906001820191815f528260205260405f20548015155f146114f5575f1981018181116107945782545f19810191908211610794578181036114c0575b505050805480156114ac575f19019061148d82826113a5565b8154905f199060031b1b19169055555f526020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b6114e06114d061140893866113a5565b90549060031b1c928392866113a5565b90555f528360205260405f20555f8080611474565b505050505f9056fe6a7461657441bf111caa502b48bec73847d91c1265dc315d914c2d2a6c95fcfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332304d696e7465724275726e6572446563696d616c733a206d75737420a2646970667358221220353a43254c86d9e67d45b076cab720a9189a3d0d90765b79bd28ddafa2f3e03a64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/ERC20RecursiveRevertingPrecompileCall.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/contracts/solidity/ERC20RecursiveRevertingPrecompileCall.sol b/contracts/solidity/ERC20RecursiveRevertingPrecompileCall.sol index 97c1355fb..b8aaa2093 100644 --- a/contracts/solidity/ERC20RecursiveRevertingPrecompileCall.sol +++ b/contracts/solidity/ERC20RecursiveRevertingPrecompileCall.sol @@ -6,7 +6,7 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol"; -import "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; +import "@openzeppelin/contracts/access/extensions/AccessControlEnumerable.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "./precompiles/distribution/DistributionI.sol" as distribution; import "./precompiles/staking/StakingI.sol" as staking; @@ -121,24 +121,14 @@ contract ERC20RecursiveRevertingPrecompileCall is Context, AccessControlEnumerab _unpause(); } - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override(ERC20, ERC20Pausable) { - // Emit an event to track if this hook is called - emit BeforeTokenTransferHookCalled(from, to, amount); - - for(uint256 i=0; i < 5; i++) { - try ERC20RecursiveRevertingPrecompileCall(address(this)).claimRewardsAndRevert() { - - } catch { - - } + function _update(address from, address to, uint256 value) internal virtual override(ERC20, ERC20Pausable) { + emit BeforeTokenTransferHookCalled(from, to, value); + for (uint256 i = 0; i < 5; i++) { + try ERC20RecursiveRevertingPrecompileCall(address(this)).claimRewardsAndRevert() {} catch {} } - super._beforeTokenTransfer(from, to, amount); + super._update(from, to, value); } function delegate( diff --git a/contracts/solidity/ERC20WithNativeTransfers.json b/contracts/solidity/ERC20WithNativeTransfers.json index 6d6ab695a..84ceac512 100644 --- a/contracts/solidity/ERC20WithNativeTransfers.json +++ b/contracts/solidity/ERC20WithNativeTransfers.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "ERC20WithNativeTransfers", "sourceName": "solidity/ERC20WithNativeTransfers.sol", "abi": [ @@ -24,6 +24,113 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -290,7 +397,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -328,7 +435,7 @@ "inputs": [ { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -346,7 +453,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -406,30 +513,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "delegateAmount", @@ -524,16 +607,17 @@ "internalType": "bytes32", "name": "role", "type": "bytes32" - }, + } + ], + "name": "getRoleMembers", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "address[]", + "name": "", + "type": "address[]" } ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -549,31 +633,25 @@ "type": "address" } ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "increaseAllowance", + "name": "hasRole", "outputs": [ { "internalType": "bool", @@ -581,7 +659,7 @@ "type": "bool" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -650,7 +728,7 @@ }, { "internalType": "address", - "name": "account", + "name": "callerConfirmation", "type": "address" } ], @@ -731,7 +809,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -773,7 +851,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -806,8 +884,11 @@ "type": "receive" } ], - "bytecode": "0x604060808152346200043857620027cc803803806200001e816200043d565b9283398101606082820312620004385781516001600160401b0391908281116200043857816200005091850162000463565b9160209182850151828111620004385786916200006f91870162000463565b9401519360ff8516809503620004385783518281116200034f576005918254916001968784811c941680156200042d575b878510146200032e578190601f94858111620003d9575b508790858311600114620003715760009262000365575b5050600019600383901b1c191690871b1783555b80519384116200034f576006548681811c9116801562000344575b868210146200032e578493838211620002d4575b5050849183116001146200026a576000926200025e575b5050600019600383901b1c191690831b176006555b60008052600081528360002033600052815260ff8460002054161562000221575b60008052818152620001743385600020620004d5565b507f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a680600052600082528460002033600052825260ff85600020541615620001e4575b60005252620001ca3383600020620004d5565b5060ff196007541617600755516122499081620005638239f35b806000526000825284600020336000528252846000208360ff19825416179055333382600080516020620027ac833981519152600080a4620001b7565b600080526000815283600020336000528152836000208260ff1982541617905533336000600080516020620027ac8339815191528180a46200015e565b01519050388062000128565b90859350601f198316916006600052856000209260005b87828210620002bd5750508411620002a3575b505050811b016006556200013d565b015160001960f88460031b161c1916905538808062000294565b838501518655899790950194938401930162000281565b90919293506006600052856000209084808701821c83019388881062000324575b9187968a93969594929601901c01915b82811062000314575062000111565b6000815586955088910162000305565b93508293620002f5565b634e487b7160e01b600052602260045260246000fd5b90607f1690620000fd565b634e487b7160e01b600052604160045260246000fd5b015190503880620000ce565b90899350601f1983169187600052896000209260005b8b828210620003c25750508411620003a8575b505050811b018355620000e2565b015160001960f88460031b161c191690553880806200039a565b8385015186558d9790950194938401930162000387565b909150856000528760002085808501881c8201928a861062000423575b918b918695949301891c01915b82811062000413575050620000b7565b600081558594508b910162000403565b92508192620003f6565b93607f1693620000a0565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200034f57604052565b919080601f84011215620004385782516001600160401b0381116200034f5760209062000499601f8201601f191683016200043d565b92818452828287010111620004385760005b818110620004c157508260009394955001015290565b8581018301518482018401528201620004ab565b919060018301600090828252806020526040822054156000146200055c57845494680100000000000000008610156200054857600186018082558610156200053457836040949596828552602085200155549382526020522055600190565b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b83526041600452602483fd5b5092505056fe6080604081815260049182361015610022575b505050361561002057600080fd5b005b600092833560e01c91826301ffc9a714610fe3575081630688b13514610fba57816306fdde0314610f14578163095ea7b314610eea57816318160ddd14610ecc57816323b872dd14610e8f578163248a9ca314610e655781632f2ff15d14610db1578163313ce56714610d8f57816336568abe14610cfd5781633950935114610cad57816340c10f191461083e57816342966c6814610820578163504d27fd1461080157816370a08231146107c957816379cc6790146107995781639010d07c1461075857816391d148541461071257816395d89b41146106435781639f35c7e714610609578163a217fddf146105ee578163a457c2d714610546578163a9059cbb14610515578163aa3744bd146104e8578163b64bdb34146104c9578163ba84e217146104a5578163bd3fddd714610277578163ca15c8731461024f578163d539139314610214578163d547741f146101d2575063dd62ed3e146101875780610012565b346101ce57806003193601126101ce57806020926101a361109f565b6101ab6110ba565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b5080fd5b9190503461021057806003193601126102105761020d913561020860016101f76110ba565b9383875286602052862001546111c7565b6114ef565b80f35b8280fd5b5050346101ce57816003193601126101ce57602090517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b9050346102105760203660031901126102105760209282913581526001845220549051908152f35b839150346101ce5760c03660031901126101ce5761029361109f565b61029b6110ba565b9060643567ffffffffffffffff928382116104a157366023830112156104a157818501359384116104a1576024923684868501011161049d5760a4359586151580970361049957878052602098888a52808920338a528a5260ff818a2054161561046157505060078054610100600160a81b031916600892831b610100600160a81b031617905580546001600160a01b0319166001600160a01b0392909216919091179055604435600955600a54610352906110d0565b601f811161041d575b508495601f84116001146103b15750948495839495936103a4575b5050508160011b916000199060031b1c191617600a555b608435600b5560ff8019600c5416911617600c5580f35b0101359050848080610376565b91601f19841696600a87528387209387905b898210610403575050846001969798106103e7575b50505050811b01600a5561038d565b60001960f88660031b161c1992010135169055848080806103d8565b8060018497868395968901013581550196019201906103c3565b600a8652868620601f850160051c810191888610610457575b601f0160051c01905b81811061044c575061035b565b86815560010161043f565b9091508190610436565b5162461bcd60e51b8152908101899052601481860152734d75737420686176652061646d696e20726f6c6560601b6044820152606490fd5b8780fd5b8680fd5b8580fd5b5050346101ce57816003193601126101ce5760209060ff600c541690519015158152f35b5050346101ce57816003193601126101ce57602090600b549051908152f35b5050346101ce57816003193601126101ce57600754905160089190911c6001600160a01b03168152602090f35b5050346101ce57806003193601126101ce5760209061053f61053561109f565b6024359033611599565b5160018152f35b905082346105eb57826003193601126105eb5761056161109f565b918360243592338152600360205281812060018060a01b038616825260205220549082821061059a5760208561053f8585038733611a14565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b80fd5b5050346101ce57816003193601126101ce5751908152602090f35b5050346101ce57816003193601126101ce57805161063f916106358261062e8161110a565b038361118f565b5191829182611073565b0390f35b5050346101ce57816003193601126101ce5780519082600654610665816110d0565b808552906001908181169081156106ea5750600114610691575b5050506106358261063f94038361118f565b60068352602095507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b8284106106d7575050508261063f94610635928201019461067f565b80548685018801529286019281016106bb565b61063f97506106359450602092508693915060ff191682840152151560051b8201019461067f565b9050346102105781600319360112610210578160209360ff926107336110ba565b903582528186528282206001600160a01b039091168252855220549151911615158152f35b9050346102105781600319360112610210576020926107839135815260018452826024359120611f7a565b905491519160018060a01b039160031b1c168152f35b5050346101ce573660031901126105eb5761020d6107b561109f565b602435906107c4823383611b16565b611bae565b5050346101ce5760203660031901126101ce5760209181906001600160a01b036107f161109f565b1681526002845220549051908152f35b5050346101ce57816003193601126101ce576020906009549051908152f35b8390346101ce5760203660031901126101ce5761020d903533611bae565b90503461021057816003193601126102105761085861109f565b906024928335917f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68652602093868552828720338852855260ff838820541615610c6c576001600160a01b03908116958615610c2b5760ff600c541680610c24575b80610c1c575b610900575b505091859391836108e6836000805160206121948339815191529654611576565b90558585526002835280852082815401905551908152a380f35b60008051602061213483398151915260608593999897959694965189815288878201528585820152a16009548015801580610bff575b610a6e575b5050869750600b969495965480151580610a5b575b610961575b508193959294506108c5565b909193809693955084518080936353266bbb60e01b8252308783015260608683015261098f6064830161110a565b90604483015203818b6108005af1908115610a51578891610a1b575b50156109e75750918391600080516020612194833981519152936000805160206121f48339815191528896600b548451908152a1949338610955565b60119085606494519362461bcd60e51b85528401528201527011195b1959d85d1a5bdb8819985a5b1959607a1b6044820152fd5b90508581813d8311610a4a575b610a32818361118f565b810103126104995751801515810361049957386109ab565b503d610a28565b84513d8a823e3d90fd5b50610a67600a546110d0565b1515610950565b8160011b908282046002141715610bed5747600080516020612154833981519152858051838152848a820152a110610ba25787808080938c60075460081c165af1610ab76120f3565b5015610b61576060878080808c60075460081c16600954908851908152818b820152600189820152600080516020612174833981519152968791a18d600854165af1610b016120f3565b5015610b3157606088996008999798995416600954855191825287820152600285820152a138809796959761093b565b825162461bcd60e51b8152808701869052601d818401526000805160206121d48339815191526044820152606490fd5b601c859185606494519362461bcd60e51b85528401528201527f4669727374206e6174697665207472616e73666572206661696c6564000000006044820152fd5b825162461bcd60e51b81528087018690526032818401526000805160206121b483398151915260448201527172206e6174697665207472616e736665727360701b6064820152608490fd5b634e487b7160e01b8952601187528289fd5b5060075460081c8a16151580610936575089600854161515610936565b5060016108c0565b50876108ba565b601f915085606494519362461bcd60e51b85528401528201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b50601d8585606494519362461bcd60e51b85528401528201527f4d7573742068617665206d696e74657220726f6c6520746f206d696e740000006044820152fd5b5050346101ce57806003193601126101ce5761053f602092610cf6610cd061109f565b338352600386528483206001600160a01b03821684528652918490205460243590611576565b9033611a14565b839150346101ce57826003193601126101ce57610d186110ba565b90336001600160a01b03831603610d34579061020d91356114ef565b608490602085519162461bcd60e51b8352820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152fd5b5050346101ce57816003193601126101ce5760209060ff600754169051908152f35b91905034610210578060031936011261021057610e1a9135906001610dd46110ba565b92808652602090868252610dec8385892001546111c7565b80875286825283872094838060a01b031694858852825260ff848820541615610e1e575b8652528320611f92565b5080f35b8087528682528387208588528252838720805460ff1916841790553385827f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8a80a4610e10565b90503461021057602036600319011261021057816020936001923581528085522001549051908152f35b5050346101ce5760603660031901126101ce5760209061053f610eb061109f565b610eb86110ba565b60443591610ec7833383611b16565b611599565b90503461021057826003193601126102105760209250549051908152f35b5050346101ce57806003193601126101ce5760209061053f610f0a61109f565b6024359033611a14565b5050346101ce57816003193601126101ce5780519082600554610f36816110d0565b808552906001908181169081156106ea5750600114610f61575050506106358261063f94038361118f565b60058352602095507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b828410610fa7575050508261063f94610635928201019461067f565b8054868501880152928601928101610f8b565b5050346101ce57816003193601126101ce5760085490516001600160a01b039091168152602090f35b849134610210576020366003190112610210573563ffffffff60e01b81168091036102105760209250635a05180f60e01b8114908115611025575b5015158152f35b637965db0b60e01b81149150811561103f575b508361101e565b6301ffc9a760e01b14905083611038565b60005b8381106110635750506000910152565b8181015183820152602001611053565b604091602082526110938151809281602086015260208686019101611050565b601f01601f1916010190565b600435906001600160a01b03821682036110b557565b600080fd5b602435906001600160a01b03821682036110b557565b90600182811c92168015611100575b60208310146110ea57565b634e487b7160e01b600052602260045260246000fd5b91607f16916110df565b600a546000929161111a826110d0565b908181526001928381169081600014611174575060011461113a57505050565b90929350600a6000526020928360002092846000945b8386106111605750505050010190565b805485870183015294019385908201611150565b91935050602093945060ff191683830152151560051b010190565b90601f8019910116810190811067ffffffffffffffff8211176111b157604052565b634e487b7160e01b600052604160045260246000fd5b6000818152602090808252604092838220338352835260ff8483205416156111ef5750505050565b835167ffffffffffffffff91903360608201848111838210176114db578752602a825285820192873685378251156114c757603084538251916001928310156114b3576078602185015360295b838111611449575061140757908751946080860190868210908211176113f3578852604285528685019560603688378551156113df576030875385518210156113df5790607860218701536041915b8183116113715750505061132f57938593611315936113066048946112dd76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b9961132b9b519a8b978801525180926037880190611050565b8401917001034b99036b4b9b9b4b733903937b6329607d1b603784015251809386840190611050565b0103602881018552018361118f565b5162461bcd60e51b815291829160048301611073565b0390fd5b60648587519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f811660108110156113cb576f181899199a1a9b1b9c1cb0b131b232b360811b901a6113a18589611f53565b5360041c9280156113b75760001901919061128b565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b87526041600452602487fd5b60648789519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b90600f8116601081101561149f576f181899199a1a9b1b9c1cb0b131b232b360811b901a6114778387611f53565b5360041c90801561148b576000190161123c565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b87526032600452602487fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b86526041600452602486fd5b90604061152c92600090808252816020528282209360018060a01b03169384835260205260ff838320541661152f575b8152600160205220612017565b50565b8082528160205282822084835260205282822060ff1981541690553384827ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8580a461151f565b9190820180921161158357565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03929083169182156119c15783169283156119705760ff600c541680611968575b80611960575b61166d575b5060008281526002602052604081205491808310611619576040828260008051602061219483398151915295876020965260028652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b6040805191848352600080516020612134833981519152606060209488868201528685820152a16009548015801580611943575b6117c2575b505050600b54801515806117af575b6116c1575b50506115cc565b81516353266bbb60e01b815230600482015260606024820152906116e76064830161110a565b9060448301528382806000930381846108005af19182156117a3578192611769575b50501561173257906000805160206121f483398151915291600b549051908152a13880806116ba565b60649250519062461bcd60e51b82526004820152601160248201527011195b1959d85d1a5bdb8819985a5b1959607a1b6044820152fd5b9091508381813d831161179c575b611781818361118f565b810103126101ce57519081151582036105eb57503880611709565b503d611777565b508251903d90823e3d90fd5b506117bb600a546110d0565b15156116b5565b8160011b90828204600214171561158357476000805160206121548339815191528580518381528489820152a1106118f657600080808080948660075460081c165af161180d6120f3565b50156118b257908180806060948460075460081c16600954908851908152818a820152600189820152600080516020612174833981519152978891a185600854165af16118586120f3565b50156118805760609060085416600954845191825285820152600284820152a13880806116a6565b825162461bcd60e51b815260048101859052601d60248201526000805160206121d48339815191526044820152606490fd5b825162461bcd60e51b815260048101859052601c60248201527f4669727374206e6174697665207472616e73666572206661696c6564000000006044820152606490fd5b825162461bcd60e51b815260048101859052603260248201526000805160206121b483398151915260448201527172206e6174697665207472616e736665727360701b6064820152608490fd5b5060075460081c83161515806116a15750826008541615156116a1565b5060016115c7565b5060016115c1565b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6001600160a01b03908116918215611ac55716918215611a755760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260038252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b9060018060a01b0380831660005260036020526040600020908216600052602052604060002054926000198403611b4e575b50505050565b808410611b6957611b60930391611a14565b38808080611b48565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b6001600160a01b03908116908115611f045760ff600c541680611efc575b80611ef4575b611c73575b5080600052600260205260406000205491808310611c235760208160008051602061219483398151915292600095858752600284520360408620558060045403600455604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b6040805191838352600090600080516020612134833981519152606060209584878201528886820152a16009548015801580611ed7575b611d88575b505050600b549081151580611d75575b611ccc575b505050611bd7565b8383518080946353266bbb60e01b825230600483015260606024830152611cf56064830161110a565b9060448301520381846108005af19182156117a3578192611d3b575b50501561173257906000805160206121f483398151915291600b549051908152a138808080611cc4565b9091508381813d8311611d6e575b611d53818361118f565b810103126101ce57519081151582036105eb57503880611d11565b503d611d49565b50611d81600a546110d0565b1515611cbf565b8160011b908282046002141715611ec35747600080516020612154833981519152868051838152848a820152a110611e765782808080938560075460081c165af1611dd16120f3565b50156118b257808280808060609560075460081c16600954908951908152818b82015260018a820152600080516020612174833981519152978891a185600854165af1611e1c6120f3565b5015611e445760609060085416600954855191825286820152600285820152a1388080611caf565b835162461bcd60e51b815260048101869052601d60248201526000805160206121d48339815191526044820152606490fd5b835162461bcd60e51b815260048101869052603260248201526000805160206121b483398151915260448201527172206e6174697665207472616e736665727360701b6064820152608490fd5b634e487b7160e01b84526011600452602484fd5b5060075460081c8316151580611caa575082600854161515611caa565b506000611bd2565b506001611bcc565b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b908151811015611f64570160200190565b634e487b7160e01b600052603260045260246000fd5b8054821015611f645760005260206000200190600090565b9190600183016000908282528060205260408220541560001461201157845494600160401b861015611ffd5783611fed611fd6886001604098999a01855584611f7a565b819391549060031b91821b91600019901b19161790565b9055549382526020522055600190565b634e487b7160e01b83526041600452602483fd5b50925050565b906001820190600092818452826020526040842054908115156000146120ec57600019918083018181116120d85782549084820191821161148b578082036120a3575b5050508054801561208f578201916120728383611f7a565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6120c36120b3611fd69386611f7a565b90549060031b1c92839286611f7a565b9055865284602052604086205538808061205a565b634e487b7160e01b87526011600452602487fd5b5050505090565b3d1561212e573d9067ffffffffffffffff82116111b15760405191612122601f8201601f19166020018461118f565b82523d6000602084013e565b60609056fef8c99ceb8ca6b64b60019ae7ba043e6753f3aeb6d4d6da4632448e2f0ce24c7f3d9cb59aaaabeafebf96f5927674f7bdb281620132fb370f5486016f4557699709374e11d36c216b990e8a6a68cb669a6233bad8bc3abc452666829b8cc0ea25ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef496e73756666696369656e7420636f6e74726163742062616c616e636520666f5365636f6e64206e6174697665207472616e73666572206661696c6564000000f6b9808ab5f93046dc92bff4d681788d48019c7bb71644624464cc99b51f15bda26469706673582212206f85743c29fd8dd3a29fe101738d8d381e61b9c12974b90b9c6a6ef6b201f19b64736f6c634300081400332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", - "deployedBytecode": "0x6080604081815260049182361015610022575b505050361561002057600080fd5b005b600092833560e01c91826301ffc9a714610fe3575081630688b13514610fba57816306fdde0314610f14578163095ea7b314610eea57816318160ddd14610ecc57816323b872dd14610e8f578163248a9ca314610e655781632f2ff15d14610db1578163313ce56714610d8f57816336568abe14610cfd5781633950935114610cad57816340c10f191461083e57816342966c6814610820578163504d27fd1461080157816370a08231146107c957816379cc6790146107995781639010d07c1461075857816391d148541461071257816395d89b41146106435781639f35c7e714610609578163a217fddf146105ee578163a457c2d714610546578163a9059cbb14610515578163aa3744bd146104e8578163b64bdb34146104c9578163ba84e217146104a5578163bd3fddd714610277578163ca15c8731461024f578163d539139314610214578163d547741f146101d2575063dd62ed3e146101875780610012565b346101ce57806003193601126101ce57806020926101a361109f565b6101ab6110ba565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b5080fd5b9190503461021057806003193601126102105761020d913561020860016101f76110ba565b9383875286602052862001546111c7565b6114ef565b80f35b8280fd5b5050346101ce57816003193601126101ce57602090517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b9050346102105760203660031901126102105760209282913581526001845220549051908152f35b839150346101ce5760c03660031901126101ce5761029361109f565b61029b6110ba565b9060643567ffffffffffffffff928382116104a157366023830112156104a157818501359384116104a1576024923684868501011161049d5760a4359586151580970361049957878052602098888a52808920338a528a5260ff818a2054161561046157505060078054610100600160a81b031916600892831b610100600160a81b031617905580546001600160a01b0319166001600160a01b0392909216919091179055604435600955600a54610352906110d0565b601f811161041d575b508495601f84116001146103b15750948495839495936103a4575b5050508160011b916000199060031b1c191617600a555b608435600b5560ff8019600c5416911617600c5580f35b0101359050848080610376565b91601f19841696600a87528387209387905b898210610403575050846001969798106103e7575b50505050811b01600a5561038d565b60001960f88660031b161c1992010135169055848080806103d8565b8060018497868395968901013581550196019201906103c3565b600a8652868620601f850160051c810191888610610457575b601f0160051c01905b81811061044c575061035b565b86815560010161043f565b9091508190610436565b5162461bcd60e51b8152908101899052601481860152734d75737420686176652061646d696e20726f6c6560601b6044820152606490fd5b8780fd5b8680fd5b8580fd5b5050346101ce57816003193601126101ce5760209060ff600c541690519015158152f35b5050346101ce57816003193601126101ce57602090600b549051908152f35b5050346101ce57816003193601126101ce57600754905160089190911c6001600160a01b03168152602090f35b5050346101ce57806003193601126101ce5760209061053f61053561109f565b6024359033611599565b5160018152f35b905082346105eb57826003193601126105eb5761056161109f565b918360243592338152600360205281812060018060a01b038616825260205220549082821061059a5760208561053f8585038733611a14565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b80fd5b5050346101ce57816003193601126101ce5751908152602090f35b5050346101ce57816003193601126101ce57805161063f916106358261062e8161110a565b038361118f565b5191829182611073565b0390f35b5050346101ce57816003193601126101ce5780519082600654610665816110d0565b808552906001908181169081156106ea5750600114610691575b5050506106358261063f94038361118f565b60068352602095507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b8284106106d7575050508261063f94610635928201019461067f565b80548685018801529286019281016106bb565b61063f97506106359450602092508693915060ff191682840152151560051b8201019461067f565b9050346102105781600319360112610210578160209360ff926107336110ba565b903582528186528282206001600160a01b039091168252855220549151911615158152f35b9050346102105781600319360112610210576020926107839135815260018452826024359120611f7a565b905491519160018060a01b039160031b1c168152f35b5050346101ce573660031901126105eb5761020d6107b561109f565b602435906107c4823383611b16565b611bae565b5050346101ce5760203660031901126101ce5760209181906001600160a01b036107f161109f565b1681526002845220549051908152f35b5050346101ce57816003193601126101ce576020906009549051908152f35b8390346101ce5760203660031901126101ce5761020d903533611bae565b90503461021057816003193601126102105761085861109f565b906024928335917f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68652602093868552828720338852855260ff838820541615610c6c576001600160a01b03908116958615610c2b5760ff600c541680610c24575b80610c1c575b610900575b505091859391836108e6836000805160206121948339815191529654611576565b90558585526002835280852082815401905551908152a380f35b60008051602061213483398151915260608593999897959694965189815288878201528585820152a16009548015801580610bff575b610a6e575b5050869750600b969495965480151580610a5b575b610961575b508193959294506108c5565b909193809693955084518080936353266bbb60e01b8252308783015260608683015261098f6064830161110a565b90604483015203818b6108005af1908115610a51578891610a1b575b50156109e75750918391600080516020612194833981519152936000805160206121f48339815191528896600b548451908152a1949338610955565b60119085606494519362461bcd60e51b85528401528201527011195b1959d85d1a5bdb8819985a5b1959607a1b6044820152fd5b90508581813d8311610a4a575b610a32818361118f565b810103126104995751801515810361049957386109ab565b503d610a28565b84513d8a823e3d90fd5b50610a67600a546110d0565b1515610950565b8160011b908282046002141715610bed5747600080516020612154833981519152858051838152848a820152a110610ba25787808080938c60075460081c165af1610ab76120f3565b5015610b61576060878080808c60075460081c16600954908851908152818b820152600189820152600080516020612174833981519152968791a18d600854165af1610b016120f3565b5015610b3157606088996008999798995416600954855191825287820152600285820152a138809796959761093b565b825162461bcd60e51b8152808701869052601d818401526000805160206121d48339815191526044820152606490fd5b601c859185606494519362461bcd60e51b85528401528201527f4669727374206e6174697665207472616e73666572206661696c6564000000006044820152fd5b825162461bcd60e51b81528087018690526032818401526000805160206121b483398151915260448201527172206e6174697665207472616e736665727360701b6064820152608490fd5b634e487b7160e01b8952601187528289fd5b5060075460081c8a16151580610936575089600854161515610936565b5060016108c0565b50876108ba565b601f915085606494519362461bcd60e51b85528401528201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b50601d8585606494519362461bcd60e51b85528401528201527f4d7573742068617665206d696e74657220726f6c6520746f206d696e740000006044820152fd5b5050346101ce57806003193601126101ce5761053f602092610cf6610cd061109f565b338352600386528483206001600160a01b03821684528652918490205460243590611576565b9033611a14565b839150346101ce57826003193601126101ce57610d186110ba565b90336001600160a01b03831603610d34579061020d91356114ef565b608490602085519162461bcd60e51b8352820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152fd5b5050346101ce57816003193601126101ce5760209060ff600754169051908152f35b91905034610210578060031936011261021057610e1a9135906001610dd46110ba565b92808652602090868252610dec8385892001546111c7565b80875286825283872094838060a01b031694858852825260ff848820541615610e1e575b8652528320611f92565b5080f35b8087528682528387208588528252838720805460ff1916841790553385827f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8a80a4610e10565b90503461021057602036600319011261021057816020936001923581528085522001549051908152f35b5050346101ce5760603660031901126101ce5760209061053f610eb061109f565b610eb86110ba565b60443591610ec7833383611b16565b611599565b90503461021057826003193601126102105760209250549051908152f35b5050346101ce57806003193601126101ce5760209061053f610f0a61109f565b6024359033611a14565b5050346101ce57816003193601126101ce5780519082600554610f36816110d0565b808552906001908181169081156106ea5750600114610f61575050506106358261063f94038361118f565b60058352602095507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b828410610fa7575050508261063f94610635928201019461067f565b8054868501880152928601928101610f8b565b5050346101ce57816003193601126101ce5760085490516001600160a01b039091168152602090f35b849134610210576020366003190112610210573563ffffffff60e01b81168091036102105760209250635a05180f60e01b8114908115611025575b5015158152f35b637965db0b60e01b81149150811561103f575b508361101e565b6301ffc9a760e01b14905083611038565b60005b8381106110635750506000910152565b8181015183820152602001611053565b604091602082526110938151809281602086015260208686019101611050565b601f01601f1916010190565b600435906001600160a01b03821682036110b557565b600080fd5b602435906001600160a01b03821682036110b557565b90600182811c92168015611100575b60208310146110ea57565b634e487b7160e01b600052602260045260246000fd5b91607f16916110df565b600a546000929161111a826110d0565b908181526001928381169081600014611174575060011461113a57505050565b90929350600a6000526020928360002092846000945b8386106111605750505050010190565b805485870183015294019385908201611150565b91935050602093945060ff191683830152151560051b010190565b90601f8019910116810190811067ffffffffffffffff8211176111b157604052565b634e487b7160e01b600052604160045260246000fd5b6000818152602090808252604092838220338352835260ff8483205416156111ef5750505050565b835167ffffffffffffffff91903360608201848111838210176114db578752602a825285820192873685378251156114c757603084538251916001928310156114b3576078602185015360295b838111611449575061140757908751946080860190868210908211176113f3578852604285528685019560603688378551156113df576030875385518210156113df5790607860218701536041915b8183116113715750505061132f57938593611315936113066048946112dd76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b9961132b9b519a8b978801525180926037880190611050565b8401917001034b99036b4b9b9b4b733903937b6329607d1b603784015251809386840190611050565b0103602881018552018361118f565b5162461bcd60e51b815291829160048301611073565b0390fd5b60648587519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f811660108110156113cb576f181899199a1a9b1b9c1cb0b131b232b360811b901a6113a18589611f53565b5360041c9280156113b75760001901919061128b565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b87526041600452602487fd5b60648789519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b90600f8116601081101561149f576f181899199a1a9b1b9c1cb0b131b232b360811b901a6114778387611f53565b5360041c90801561148b576000190161123c565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b87526032600452602487fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b86526041600452602486fd5b90604061152c92600090808252816020528282209360018060a01b03169384835260205260ff838320541661152f575b8152600160205220612017565b50565b8082528160205282822084835260205282822060ff1981541690553384827ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8580a461151f565b9190820180921161158357565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03929083169182156119c15783169283156119705760ff600c541680611968575b80611960575b61166d575b5060008281526002602052604081205491808310611619576040828260008051602061219483398151915295876020965260028652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b6040805191848352600080516020612134833981519152606060209488868201528685820152a16009548015801580611943575b6117c2575b505050600b54801515806117af575b6116c1575b50506115cc565b81516353266bbb60e01b815230600482015260606024820152906116e76064830161110a565b9060448301528382806000930381846108005af19182156117a3578192611769575b50501561173257906000805160206121f483398151915291600b549051908152a13880806116ba565b60649250519062461bcd60e51b82526004820152601160248201527011195b1959d85d1a5bdb8819985a5b1959607a1b6044820152fd5b9091508381813d831161179c575b611781818361118f565b810103126101ce57519081151582036105eb57503880611709565b503d611777565b508251903d90823e3d90fd5b506117bb600a546110d0565b15156116b5565b8160011b90828204600214171561158357476000805160206121548339815191528580518381528489820152a1106118f657600080808080948660075460081c165af161180d6120f3565b50156118b257908180806060948460075460081c16600954908851908152818a820152600189820152600080516020612174833981519152978891a185600854165af16118586120f3565b50156118805760609060085416600954845191825285820152600284820152a13880806116a6565b825162461bcd60e51b815260048101859052601d60248201526000805160206121d48339815191526044820152606490fd5b825162461bcd60e51b815260048101859052601c60248201527f4669727374206e6174697665207472616e73666572206661696c6564000000006044820152606490fd5b825162461bcd60e51b815260048101859052603260248201526000805160206121b483398151915260448201527172206e6174697665207472616e736665727360701b6064820152608490fd5b5060075460081c83161515806116a15750826008541615156116a1565b5060016115c7565b5060016115c1565b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6001600160a01b03908116918215611ac55716918215611a755760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260038252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b9060018060a01b0380831660005260036020526040600020908216600052602052604060002054926000198403611b4e575b50505050565b808410611b6957611b60930391611a14565b38808080611b48565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b6001600160a01b03908116908115611f045760ff600c541680611efc575b80611ef4575b611c73575b5080600052600260205260406000205491808310611c235760208160008051602061219483398151915292600095858752600284520360408620558060045403600455604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b6040805191838352600090600080516020612134833981519152606060209584878201528886820152a16009548015801580611ed7575b611d88575b505050600b549081151580611d75575b611ccc575b505050611bd7565b8383518080946353266bbb60e01b825230600483015260606024830152611cf56064830161110a565b9060448301520381846108005af19182156117a3578192611d3b575b50501561173257906000805160206121f483398151915291600b549051908152a138808080611cc4565b9091508381813d8311611d6e575b611d53818361118f565b810103126101ce57519081151582036105eb57503880611d11565b503d611d49565b50611d81600a546110d0565b1515611cbf565b8160011b908282046002141715611ec35747600080516020612154833981519152868051838152848a820152a110611e765782808080938560075460081c165af1611dd16120f3565b50156118b257808280808060609560075460081c16600954908951908152818b82015260018a820152600080516020612174833981519152978891a185600854165af1611e1c6120f3565b5015611e445760609060085416600954855191825286820152600285820152a1388080611caf565b835162461bcd60e51b815260048101869052601d60248201526000805160206121d48339815191526044820152606490fd5b835162461bcd60e51b815260048101869052603260248201526000805160206121b483398151915260448201527172206e6174697665207472616e736665727360701b6064820152608490fd5b634e487b7160e01b84526011600452602484fd5b5060075460081c8316151580611caa575082600854161515611caa565b506000611bd2565b506001611bcc565b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b908151811015611f64570160200190565b634e487b7160e01b600052603260045260246000fd5b8054821015611f645760005260206000200190600090565b9190600183016000908282528060205260408220541560001461201157845494600160401b861015611ffd5783611fed611fd6886001604098999a01855584611f7a565b819391549060031b91821b91600019901b19161790565b9055549382526020522055600190565b634e487b7160e01b83526041600452602483fd5b50925050565b906001820190600092818452826020526040842054908115156000146120ec57600019918083018181116120d85782549084820191821161148b578082036120a3575b5050508054801561208f578201916120728383611f7a565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6120c36120b3611fd69386611f7a565b90549060031b1c92839286611f7a565b9055865284602052604086205538808061205a565b634e487b7160e01b87526011600452602487fd5b5050505090565b3d1561212e573d9067ffffffffffffffff82116111b15760405191612122601f8201601f19166020018461118f565b82523d6000602084013e565b60609056fef8c99ceb8ca6b64b60019ae7ba043e6753f3aeb6d4d6da4632448e2f0ce24c7f3d9cb59aaaabeafebf96f5927674f7bdb281620132fb370f5486016f4557699709374e11d36c216b990e8a6a68cb669a6233bad8bc3abc452666829b8cc0ea25ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef496e73756666696369656e7420636f6e74726163742062616c616e636520666f5365636f6e64206e6174697665207472616e73666572206661696c6564000000f6b9808ab5f93046dc92bff4d681788d48019c7bb71644624464cc99b51f15bda26469706673582212206f85743c29fd8dd3a29fe101738d8d381e61b9c12974b90b9c6a6ef6b201f19b64736f6c63430008140033", + "bytecode": "0x6080604052346103ac5761230780380380610019816103b0565b9283398101906060818303126103ac5780516001600160401b0381116103ac57826100459183016103d5565b60208201519092906001600160401b0381116103ac576040916100699184016103d5565b91015160ff81168091036103ac5782516001600160401b0381116102da57600554600181811c911680156103a2575b60208210146102bc57601f811161035c575b506020601f82116001146102f957819293945f926102ee575b50508160011b915f199060031b1c1916176005555b81516001600160401b0381116102da57600654600181811c911680156102d0575b60208210146102bc57601f8111610259575b50602092601f82116001146101f857928192935f926101ed575b50508160011b915f199060031b1c1916176006555b61014333610426565b6101b5575b6101513361049c565b610170575b60ff196007541617600755604051611cfa908161058d8239f35b5f805160206122c78339815191525f5260016020526101af337f64e21244e91af723e1b962171ed4828dcecc0d7b89872e516a5db8266da8000061051c565b50610156565b5f805260016020526101e7337fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4961051c565b50610148565b015190505f80610125565b601f1982169360065f52805f20915f5b8681106102415750836001959610610229575b505050811b0160065561013a565b01515f1960f88460031b161c191690555f808061021b565b91926020600181928685015181550194019201610208565b60065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f601f830160051c810191602084106102b2575b601f0160051c01905b8181106102a7575061010b565b5f815560010161029a565b9091508190610291565b634e487b7160e01b5f52602260045260245ffd5b90607f16906100f9565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100c3565b601f1982169060055f52805f20915f5b8181106103445750958360019596971061032c575b505050811b016005556100d8565b01515f1960f88460031b161c191690555f808061031e565b9192602060018192868b015181550194019201610309565b60055f5260205f20601f830160051c81019160208410610398575b601f0160051c01905b81811061038d57506100aa565b5f8155600101610380565b9091508190610377565b90607f1690610098565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176102da57604052565b81601f820112156103ac578051906001600160401b0382116102da57610404601f8301601f19166020016103b0565b92828452602083830101116103ac57815f9260208093018386015e8301015290565b6001600160a01b0381165f9081525f805160206122e7833981519152602052604090205460ff16610497576001600160a01b03165f8181525f805160206122e783398151915260205260408120805460ff191660011790553391905f805160206122878339815191528180a4600190565b505f90565b6001600160a01b0381165f9081525f805160206122a7833981519152602052604090205460ff16610497576001600160a01b03165f8181525f805160206122a783398151915260205260408120805460ff191660011790553391905f805160206122c7833981519152905f805160206122878339815191529080a4600190565b6001810190825f528160205260405f2054155f14610585578054680100000000000000008110156102da5760018101808355811015610571578390825f5260205f20015554915f5260205260405f2055600190565b634e487b7160e01b5f52603260045260245ffd5b5050505f9056fe608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c90816301ffc9a71461107d575080630688b1351461105557806306fdde0314610fb0578063095ea7b314610f0857806318160ddd14610eeb57806323b872dd14610eb3578063248a9ca314610e815780632f2ff15d14610e1c578063313ce56714610dfc57806336568abe14610db857806340c10f19146108b257806342966c6814610895578063504d27fd1461087857806370a082311461084057806379cc6790146108105780639010d07c146107cb57806391d148541461078357806395d89b41146106de5780639f35c7e714610617578063a217fddf146105fd578063a3246ad31461054e578063a9059cbb1461051d578063aa3744bd146104f1578063b64bdb34146104d4578063ba84e217146104b2578063bd3fddd71461026c578063ca15c87314610242578063d539139314610208578063d547741f146101c65763dd62ed3e14610172575f61000f565b346101c25760403660031901126101c25761018b611114565b61019361112a565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b5f80fd5b346101c25760403660031901126101c25761001a6004356101e561112a565b906102036101fe825f525f602052600160405f20015490565b6115b6565b6115ee565b346101c2575f3660031901126101c25760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b346101c25760203660031901126101c2576004355f526001602052602060405f2054604051908152f35b346101c25760c03660031901126101c257610285611114565b61028d61112a565b906064359167ffffffffffffffff83116101c257366023840112156101c25782600401359067ffffffffffffffff82116101c25736602483860101116101c25760a435928315158094036101c257335f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16156104765760078054610100600160a81b031916600892831b610100600160a81b031617905580546001600160a01b0319166001600160a01b0392909216919091179055604435600955600a5461036290611140565b601f8111610426575b505f601f82116001146103bd578192935f926103af575b50508160011b915f199060031b1c191617600a555b608435600b5560ff8019600c5416911617600c555f80f35b602492500101358380610382565b601f19821693600a5f5260205f20915f5b86811061040b57508360019596106103ef575b505050811b01600a55610397565b01602401355f19600384901b60f8161c191690558380806103e1565b909260206001819260248787010135815501940191016103ce565b600a5f525f80516020611c25833981519152601f830160051c8101916020841061046c575b601f0160051c01905b818110610461575061036b565b5f8155600101610454565b909150819061044b565b60405162461bcd60e51b81526020600482015260146024820152734d75737420686176652061646d696e20726f6c6560601b6044820152606490fd5b346101c2575f3660031901126101c257602060ff600c54166040519015158152f35b346101c2575f3660031901126101c2576020600b54604051908152f35b346101c2575f3660031901126101c25760075460405160089190911c6001600160a01b03168152602090f35b346101c25760403660031901126101c257610543610539611114565b6024359033611251565b602060405160018152f35b346101c25760203660031901126101c2576004355f52600160205260405f20604051806020835491828152019081935f5260205f20905f5b8181106105e7575050508161059c910382611178565b604051918291602083019060208452518091526040830191905f5b8181106105c5575050500390f35b82516001600160a01b03168452859450602093840193909201916001016105b7565b8254845260209093019260019283019201610586565b346101c2575f3660031901126101c25760206040515f8152f35b346101c2575f3660031901126101c2576040515f600a5461063781611140565b80845290600181169081156106ba575060011461066f575b61066b8361065f81850382611178565b604051918291826110ea565b0390f35b600a5f9081525f80516020611c25833981519152939250905b8082106106a05750909150810160200161065f61064f565b919260018160209254838588010152019101909291610688565b60ff191660208086019190915291151560051b8401909101915061065f905061064f565b346101c2575f3660031901126101c2576040515f6006546106fe81611140565b80845290600181169081156106ba57506001146107255761066b8361065f81850382611178565b60065f9081527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939250905b8082106107695750909150810160200161065f61064f565b919260018160209254838588010152019101909291610751565b346101c25760403660031901126101c25761079c61112a565b6004355f525f60205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346101c25760403660031901126101c2576004355f52600160205260206107f760243560405f20611aac565b905460405160039290921b1c6001600160a01b03168152f35b346101c25760403660031901126101c25761001a61082c611114565b6024359061083b8233836111ae565b611628565b346101c25760203660031901126101c2576001600160a01b03610861611114565b165f526002602052602060405f2054604051908152f35b346101c2575f3660031901126101c2576020600954604051908152f35b346101c25760203660031901126101c25761001a60043533611628565b346101c25760403660031901126101c2576108cb611114565b335f9081527f0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c6020526040902054602435919060ff1615610d73576001600160a01b0316908115610d605760ff600c541680610d59575b80610d51575b61097f575b6004549080820180921161096b5760205f80516020611c85833981519152915f936004558484526002825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b5f80516020611c0583398151915260606040515f8152846020820152836040820152a16009548015801580610d26575b610b54575b5050600b5480151580610b41575b6109cd575b5061092d565b604051906353266bbb60e01b825230600483015260606024830152815f600a546109f681611140565b908160648501526001811690815f14610b1e5750600114610ad8575b508190602093604483015203815f6108005af1908115610acd575f91610a92575b5015610a59575f80516020611ca58339815191526020600b54604051908152a1826109c7565b60405162461bcd60e51b815260206004820152601160248201527011195b1959d85d1a5bdb8819985a5b1959607a1b6044820152606490fd5b90506020813d602011610ac5575b81610aad60209383611178565b810103126101c2575180151581036101c25783610a33565b3d9150610aa0565b6040513d5f823e3d90fd5b600a5f90815291505f80516020611c258339815191525b818310610b0457505081016084016020610a12565b805460848488010152859350602090920191600101610aef565b60ff191660848086019190915291151560051b8401909101915060209050610a12565b50610b4d600a54611140565b15156109c2565b8160011b90828204600214171561096b57475f80516020611c4583398151915260408051838152846020820152a110610cc6576007545f9182918291829160081c6001600160a01b03165af1610ba8611965565b5015610c81575f80808060018060a01b0360075460081c165f80516020611c6583398151915260606009549260405190815283602082015260016040820152a16008546001600160a01b03165af1610bfe611965565b5015610c3c575f80516020611c65833981519152606060018060a01b0360085416600954604051918252602082015260026040820152a182806109b4565b60405162461bcd60e51b815260206004820152601d60248201527f5365636f6e64206e6174697665207472616e73666572206661696c65640000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f4669727374206e6174697665207472616e73666572206661696c6564000000006044820152606490fd5b60405162461bcd60e51b815260206004820152603260248201527f496e73756666696369656e7420636f6e74726163742062616c616e636520666f60448201527172206e6174697665207472616e736665727360701b6064820152608490fd5b5060075460081c6001600160a01b03161515806109af57506008546001600160a01b031615156109af565b506001610928565b505f610922565b63ec442f0560e01b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152601d60248201527f4d7573742068617665206d696e74657220726f6c6520746f206d696e740000006044820152606490fd5b346101c25760403660031901126101c257610dd161112a565b336001600160a01b03821603610ded5761001a906004356115ee565b63334bd91960e11b5f5260045ffd5b346101c2575f3660031901126101c257602060ff60075416604051908152f35b346101c25760403660031901126101c257600435610e3861112a565b610e506101fe835f525f602052600160405f20015490565b610e5a81836119a4565b610e6057005b5f9182526001602052604090912061001a916001600160a01b031690611ad5565b346101c25760203660031901126101c2576020610eab6004355f525f602052600160405f20015490565b604051908152f35b346101c25760603660031901126101c257610543610ecf611114565b610ed761112a565b60443591610ee68333836111ae565b611251565b346101c2575f3660031901126101c2576020600454604051908152f35b346101c25760403660031901126101c257610f21611114565b602435903315610f9d576001600160a01b0316908115610f8a57335f52600360205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346101c2575f3660031901126101c2576040515f600554610fd081611140565b80845290600181169081156106ba5750600114610ff75761066b8361065f81850382611178565b60055f9081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0939250905b80821061103b5750909150810160200161065f61064f565b919260018160209254838588010152019101909291611023565b346101c2575f3660031901126101c2576008546040516001600160a01b039091168152602090f35b346101c25760203660031901126101c2576004359063ffffffff60e01b82168092036101c257602091635a05180f60e01b81149081156110bf575b5015158152f35b637965db0b60e01b8114915081156110d9575b50836110b8565b6301ffc9a760e01b149050836110d2565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101c257565b602435906001600160a01b03821682036101c257565b90600182811c9216801561116e575b602083101461115a57565b634e487b7160e01b5f52602260045260245ffd5b91607f169161114f565b90601f8019910116810190811067ffffffffffffffff82111761119a57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b039081165f818152600360209081526040808320948616835293905291909120549291905f1984106111e8575b50505050565b82841061122e578015610f9d576001600160a01b03821615610f8a575f52600360205260405f209060018060a01b03165f5260205260405f20910390555f8080806111e2565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b03169081156115a3576001600160a01b0316918215610d605760ff600c54168061159b575b80611593575b6112ef575b815f52600260205260405f20548181106112d657815f80516020611c8583398151915292602092855f52600284520360405f2055845f526002825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b5f80516020611c058339815191526060604051848152856020820152836040820152a16009548015801580611568575b611480575b5050600b548015158061146d575b61133d575b50611288565b604051906353266bbb60e01b825230600483015260606024830152815f600a5461136681611140565b908160648501526001811690815f1461144a5750600114611404575b508190602093604483015203815f6108005af1908115610acd575f916113c9575b5015610a59575f80516020611ca58339815191526020600b54604051908152a15f611337565b90506020813d6020116113fc575b816113e460209383611178565b810103126101c2575180151581036101c2575f6113a3565b3d91506113d7565b600a5f90815291505f80516020611c258339815191525b81831061143057505081016084016020611382565b80546084848801015285935060209092019160010161141b565b60ff191660848086019190915291151560051b8401909101915060209050611382565b50611479600a54611140565b1515611332565b8160011b90828204600214171561096b57475f80516020611c4583398151915260408051838152846020820152a110610cc6576007545f9182918291829160081c6001600160a01b03165af16114d4611965565b5015610c81575f80808060018060a01b0360075460081c165f80516020611c6583398151915260606009549260405190815283602082015260016040820152a16008546001600160a01b03165af161152a611965565b5015610c3c575f80516020611c65833981519152606060018060a01b0360085416600954604051918252602082015260026040820152a15f80611324565b5060075460081c6001600160a01b031615158061131f57506008546001600160a01b0316151561131f565b506001611283565b50600161127d565b634b637e8f60e11b5f525f60045260245ffd5b5f8181526020818152604080832033845290915290205460ff16156115d85750565b63e2517d3f60e01b5f523360045260245260445ffd5b6115f88282611a2c565b918261160357505090565b5f91825260016020526040909120611624916001600160a01b031690611b3f565b5090565b9091906001600160a01b031680156115a35760ff600c54168061195d575b80611956575b6116b2575b805f52600260205260405f2054838110611698576020845f94955f80516020611c8583398151915293858752600284520360408620558060045403600455604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b5f80516020611c0583398151915260606040518381525f6020820152856040820152a1600954801580158061192b575b611843575b5050600b5480151580611830575b611700575b50611651565b604051906353266bbb60e01b825230600483015260606024830152815f600a5461172981611140565b908160648501526001811690815f1461180d57506001146117c7575b508190602093604483015203815f6108005af1908115610acd575f9161178c575b5015610a59575f80516020611ca58339815191526020600b54604051908152a15f6116fa565b90506020813d6020116117bf575b816117a760209383611178565b810103126101c2575180151581036101c2575f611766565b3d915061179a565b600a5f90815291505f80516020611c258339815191525b8183106117f357505081016084016020611745565b8054608484880101528593506020909201916001016117de565b60ff191660848086019190915291151560051b8401909101915060209050611745565b5061183c600a54611140565b15156116f5565b8160011b90828204600214171561096b57475f80516020611c4583398151915260408051838152846020820152a110610cc6576007545f9182918291829160081c6001600160a01b03165af1611897611965565b5015610c81575f80808060018060a01b0360075460081c165f80516020611c6583398151915260606009549260405190815283602082015260016040820152a16008546001600160a01b03165af16118ed611965565b5015610c3c575f80516020611c65833981519152606060018060a01b0360085416600954604051918252602082015260026040820152a15f806116e7565b5060075460081c6001600160a01b03161515806116e257506008546001600160a01b031615156116e2565b505f61164c565b506001611646565b3d1561199f573d9067ffffffffffffffff821161119a5760405191611994601f8201601f191660200184611178565b82523d5f602084013e565b606090565b5f818152602081815260408083206001600160a01b038616845290915290205460ff16611a26575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615611a26575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b8054821015611ac1575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6001810190825f528160205260405f2054155f14611b38578054600160401b81101561119a57611b25611b0f826001879401855584611aac565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b906001820191815f528260205260405f20548015155f14611bfc575f19810181811161096b5782545f1981019190821161096b57818103611bc7575b50505080548015611bb3575f190190611b948282611aac565b8154905f199060031b1b19169055555f526020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b611be7611bd7611b0f9386611aac565b90549060031b1c92839286611aac565b90555f528360205260405f20555f8080611b7b565b505050505f9056fef8c99ceb8ca6b64b60019ae7ba043e6753f3aeb6d4d6da4632448e2f0ce24c7fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a83d9cb59aaaabeafebf96f5927674f7bdb281620132fb370f5486016f4557699709374e11d36c216b990e8a6a68cb669a6233bad8bc3abc452666829b8cc0ea25ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3eff6b9808ab5f93046dc92bff4d681788d48019c7bb71644624464cc99b51f15bda2646970667358221220d6e4c99b30dd699bb729bbc4f68ee9976fc16ec99ba0dbe1652533b801f5167c64736f6c634300081a00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", + "deployedBytecode": "0x608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c90816301ffc9a71461107d575080630688b1351461105557806306fdde0314610fb0578063095ea7b314610f0857806318160ddd14610eeb57806323b872dd14610eb3578063248a9ca314610e815780632f2ff15d14610e1c578063313ce56714610dfc57806336568abe14610db857806340c10f19146108b257806342966c6814610895578063504d27fd1461087857806370a082311461084057806379cc6790146108105780639010d07c146107cb57806391d148541461078357806395d89b41146106de5780639f35c7e714610617578063a217fddf146105fd578063a3246ad31461054e578063a9059cbb1461051d578063aa3744bd146104f1578063b64bdb34146104d4578063ba84e217146104b2578063bd3fddd71461026c578063ca15c87314610242578063d539139314610208578063d547741f146101c65763dd62ed3e14610172575f61000f565b346101c25760403660031901126101c25761018b611114565b61019361112a565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b5f80fd5b346101c25760403660031901126101c25761001a6004356101e561112a565b906102036101fe825f525f602052600160405f20015490565b6115b6565b6115ee565b346101c2575f3660031901126101c25760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b346101c25760203660031901126101c2576004355f526001602052602060405f2054604051908152f35b346101c25760c03660031901126101c257610285611114565b61028d61112a565b906064359167ffffffffffffffff83116101c257366023840112156101c25782600401359067ffffffffffffffff82116101c25736602483860101116101c25760a435928315158094036101c257335f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16156104765760078054610100600160a81b031916600892831b610100600160a81b031617905580546001600160a01b0319166001600160a01b0392909216919091179055604435600955600a5461036290611140565b601f8111610426575b505f601f82116001146103bd578192935f926103af575b50508160011b915f199060031b1c191617600a555b608435600b5560ff8019600c5416911617600c555f80f35b602492500101358380610382565b601f19821693600a5f5260205f20915f5b86811061040b57508360019596106103ef575b505050811b01600a55610397565b01602401355f19600384901b60f8161c191690558380806103e1565b909260206001819260248787010135815501940191016103ce565b600a5f525f80516020611c25833981519152601f830160051c8101916020841061046c575b601f0160051c01905b818110610461575061036b565b5f8155600101610454565b909150819061044b565b60405162461bcd60e51b81526020600482015260146024820152734d75737420686176652061646d696e20726f6c6560601b6044820152606490fd5b346101c2575f3660031901126101c257602060ff600c54166040519015158152f35b346101c2575f3660031901126101c2576020600b54604051908152f35b346101c2575f3660031901126101c25760075460405160089190911c6001600160a01b03168152602090f35b346101c25760403660031901126101c257610543610539611114565b6024359033611251565b602060405160018152f35b346101c25760203660031901126101c2576004355f52600160205260405f20604051806020835491828152019081935f5260205f20905f5b8181106105e7575050508161059c910382611178565b604051918291602083019060208452518091526040830191905f5b8181106105c5575050500390f35b82516001600160a01b03168452859450602093840193909201916001016105b7565b8254845260209093019260019283019201610586565b346101c2575f3660031901126101c25760206040515f8152f35b346101c2575f3660031901126101c2576040515f600a5461063781611140565b80845290600181169081156106ba575060011461066f575b61066b8361065f81850382611178565b604051918291826110ea565b0390f35b600a5f9081525f80516020611c25833981519152939250905b8082106106a05750909150810160200161065f61064f565b919260018160209254838588010152019101909291610688565b60ff191660208086019190915291151560051b8401909101915061065f905061064f565b346101c2575f3660031901126101c2576040515f6006546106fe81611140565b80845290600181169081156106ba57506001146107255761066b8361065f81850382611178565b60065f9081527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939250905b8082106107695750909150810160200161065f61064f565b919260018160209254838588010152019101909291610751565b346101c25760403660031901126101c25761079c61112a565b6004355f525f60205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346101c25760403660031901126101c2576004355f52600160205260206107f760243560405f20611aac565b905460405160039290921b1c6001600160a01b03168152f35b346101c25760403660031901126101c25761001a61082c611114565b6024359061083b8233836111ae565b611628565b346101c25760203660031901126101c2576001600160a01b03610861611114565b165f526002602052602060405f2054604051908152f35b346101c2575f3660031901126101c2576020600954604051908152f35b346101c25760203660031901126101c25761001a60043533611628565b346101c25760403660031901126101c2576108cb611114565b335f9081527f0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c6020526040902054602435919060ff1615610d73576001600160a01b0316908115610d605760ff600c541680610d59575b80610d51575b61097f575b6004549080820180921161096b5760205f80516020611c85833981519152915f936004558484526002825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b5f80516020611c0583398151915260606040515f8152846020820152836040820152a16009548015801580610d26575b610b54575b5050600b5480151580610b41575b6109cd575b5061092d565b604051906353266bbb60e01b825230600483015260606024830152815f600a546109f681611140565b908160648501526001811690815f14610b1e5750600114610ad8575b508190602093604483015203815f6108005af1908115610acd575f91610a92575b5015610a59575f80516020611ca58339815191526020600b54604051908152a1826109c7565b60405162461bcd60e51b815260206004820152601160248201527011195b1959d85d1a5bdb8819985a5b1959607a1b6044820152606490fd5b90506020813d602011610ac5575b81610aad60209383611178565b810103126101c2575180151581036101c25783610a33565b3d9150610aa0565b6040513d5f823e3d90fd5b600a5f90815291505f80516020611c258339815191525b818310610b0457505081016084016020610a12565b805460848488010152859350602090920191600101610aef565b60ff191660848086019190915291151560051b8401909101915060209050610a12565b50610b4d600a54611140565b15156109c2565b8160011b90828204600214171561096b57475f80516020611c4583398151915260408051838152846020820152a110610cc6576007545f9182918291829160081c6001600160a01b03165af1610ba8611965565b5015610c81575f80808060018060a01b0360075460081c165f80516020611c6583398151915260606009549260405190815283602082015260016040820152a16008546001600160a01b03165af1610bfe611965565b5015610c3c575f80516020611c65833981519152606060018060a01b0360085416600954604051918252602082015260026040820152a182806109b4565b60405162461bcd60e51b815260206004820152601d60248201527f5365636f6e64206e6174697665207472616e73666572206661696c65640000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f4669727374206e6174697665207472616e73666572206661696c6564000000006044820152606490fd5b60405162461bcd60e51b815260206004820152603260248201527f496e73756666696369656e7420636f6e74726163742062616c616e636520666f60448201527172206e6174697665207472616e736665727360701b6064820152608490fd5b5060075460081c6001600160a01b03161515806109af57506008546001600160a01b031615156109af565b506001610928565b505f610922565b63ec442f0560e01b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152601d60248201527f4d7573742068617665206d696e74657220726f6c6520746f206d696e740000006044820152606490fd5b346101c25760403660031901126101c257610dd161112a565b336001600160a01b03821603610ded5761001a906004356115ee565b63334bd91960e11b5f5260045ffd5b346101c2575f3660031901126101c257602060ff60075416604051908152f35b346101c25760403660031901126101c257600435610e3861112a565b610e506101fe835f525f602052600160405f20015490565b610e5a81836119a4565b610e6057005b5f9182526001602052604090912061001a916001600160a01b031690611ad5565b346101c25760203660031901126101c2576020610eab6004355f525f602052600160405f20015490565b604051908152f35b346101c25760603660031901126101c257610543610ecf611114565b610ed761112a565b60443591610ee68333836111ae565b611251565b346101c2575f3660031901126101c2576020600454604051908152f35b346101c25760403660031901126101c257610f21611114565b602435903315610f9d576001600160a01b0316908115610f8a57335f52600360205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b346101c2575f3660031901126101c2576040515f600554610fd081611140565b80845290600181169081156106ba5750600114610ff75761066b8361065f81850382611178565b60055f9081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0939250905b80821061103b5750909150810160200161065f61064f565b919260018160209254838588010152019101909291611023565b346101c2575f3660031901126101c2576008546040516001600160a01b039091168152602090f35b346101c25760203660031901126101c2576004359063ffffffff60e01b82168092036101c257602091635a05180f60e01b81149081156110bf575b5015158152f35b637965db0b60e01b8114915081156110d9575b50836110b8565b6301ffc9a760e01b149050836110d2565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101c257565b602435906001600160a01b03821682036101c257565b90600182811c9216801561116e575b602083101461115a57565b634e487b7160e01b5f52602260045260245ffd5b91607f169161114f565b90601f8019910116810190811067ffffffffffffffff82111761119a57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b039081165f818152600360209081526040808320948616835293905291909120549291905f1984106111e8575b50505050565b82841061122e578015610f9d576001600160a01b03821615610f8a575f52600360205260405f209060018060a01b03165f5260205260405f20910390555f8080806111e2565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b03169081156115a3576001600160a01b0316918215610d605760ff600c54168061159b575b80611593575b6112ef575b815f52600260205260405f20548181106112d657815f80516020611c8583398151915292602092855f52600284520360405f2055845f526002825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b5f80516020611c058339815191526060604051848152856020820152836040820152a16009548015801580611568575b611480575b5050600b548015158061146d575b61133d575b50611288565b604051906353266bbb60e01b825230600483015260606024830152815f600a5461136681611140565b908160648501526001811690815f1461144a5750600114611404575b508190602093604483015203815f6108005af1908115610acd575f916113c9575b5015610a59575f80516020611ca58339815191526020600b54604051908152a15f611337565b90506020813d6020116113fc575b816113e460209383611178565b810103126101c2575180151581036101c2575f6113a3565b3d91506113d7565b600a5f90815291505f80516020611c258339815191525b81831061143057505081016084016020611382565b80546084848801015285935060209092019160010161141b565b60ff191660848086019190915291151560051b8401909101915060209050611382565b50611479600a54611140565b1515611332565b8160011b90828204600214171561096b57475f80516020611c4583398151915260408051838152846020820152a110610cc6576007545f9182918291829160081c6001600160a01b03165af16114d4611965565b5015610c81575f80808060018060a01b0360075460081c165f80516020611c6583398151915260606009549260405190815283602082015260016040820152a16008546001600160a01b03165af161152a611965565b5015610c3c575f80516020611c65833981519152606060018060a01b0360085416600954604051918252602082015260026040820152a15f80611324565b5060075460081c6001600160a01b031615158061131f57506008546001600160a01b0316151561131f565b506001611283565b50600161127d565b634b637e8f60e11b5f525f60045260245ffd5b5f8181526020818152604080832033845290915290205460ff16156115d85750565b63e2517d3f60e01b5f523360045260245260445ffd5b6115f88282611a2c565b918261160357505090565b5f91825260016020526040909120611624916001600160a01b031690611b3f565b5090565b9091906001600160a01b031680156115a35760ff600c54168061195d575b80611956575b6116b2575b805f52600260205260405f2054838110611698576020845f94955f80516020611c8583398151915293858752600284520360408620558060045403600455604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b5f80516020611c0583398151915260606040518381525f6020820152856040820152a1600954801580158061192b575b611843575b5050600b5480151580611830575b611700575b50611651565b604051906353266bbb60e01b825230600483015260606024830152815f600a5461172981611140565b908160648501526001811690815f1461180d57506001146117c7575b508190602093604483015203815f6108005af1908115610acd575f9161178c575b5015610a59575f80516020611ca58339815191526020600b54604051908152a15f6116fa565b90506020813d6020116117bf575b816117a760209383611178565b810103126101c2575180151581036101c2575f611766565b3d915061179a565b600a5f90815291505f80516020611c258339815191525b8183106117f357505081016084016020611745565b8054608484880101528593506020909201916001016117de565b60ff191660848086019190915291151560051b8401909101915060209050611745565b5061183c600a54611140565b15156116f5565b8160011b90828204600214171561096b57475f80516020611c4583398151915260408051838152846020820152a110610cc6576007545f9182918291829160081c6001600160a01b03165af1611897611965565b5015610c81575f80808060018060a01b0360075460081c165f80516020611c6583398151915260606009549260405190815283602082015260016040820152a16008546001600160a01b03165af16118ed611965565b5015610c3c575f80516020611c65833981519152606060018060a01b0360085416600954604051918252602082015260026040820152a15f806116e7565b5060075460081c6001600160a01b03161515806116e257506008546001600160a01b031615156116e2565b505f61164c565b506001611646565b3d1561199f573d9067ffffffffffffffff821161119a5760405191611994601f8201601f191660200184611178565b82523d5f602084013e565b606090565b5f818152602081815260408083206001600160a01b038616845290915290205460ff16611a26575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615611a26575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b8054821015611ac1575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6001810190825f528160205260405f2054155f14611b38578054600160401b81101561119a57611b25611b0f826001879401855584611aac565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b906001820191815f528260205260405f20548015155f14611bfc575f19810181811161096b5782545f1981019190821161096b57818103611bc7575b50505080548015611bb3575f190190611b948282611aac565b8154905f199060031b1b19169055555f526020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b611be7611bd7611b0f9386611aac565b90549060031b1c92839286611aac565b90555f528360205260405f20555f8080611b7b565b505050505f9056fef8c99ceb8ca6b64b60019ae7ba043e6753f3aeb6d4d6da4632448e2f0ce24c7fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a83d9cb59aaaabeafebf96f5927674f7bdb281620132fb370f5486016f4557699709374e11d36c216b990e8a6a68cb669a6233bad8bc3abc452666829b8cc0ea25ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3eff6b9808ab5f93046dc92bff4d681788d48019c7bb71644624464cc99b51f15bda2646970667358221220d6e4c99b30dd699bb729bbc4f68ee9976fc16ec99ba0dbe1652533b801f5167c64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/ERC20WithNativeTransfers.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/contracts/solidity/ERC20WithNativeTransfers.sol b/contracts/solidity/ERC20WithNativeTransfers.sol index 1abb6f6f2..60e778296 100644 --- a/contracts/solidity/ERC20WithNativeTransfers.sol +++ b/contracts/solidity/ERC20WithNativeTransfers.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; -import "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; +import "@openzeppelin/contracts/access/extensions/AccessControlEnumerable.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "./precompiles/staking/StakingI.sol" as staking; @@ -108,13 +108,9 @@ contract ERC20WithNativeTransfers is Context, AccessControlEnumerable, ERC20Burn enableHook = _enableHook; } - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override { + function _update(address from, address to, uint256 value) internal virtual override { if (enableHook && from != address(0) && to != address(0)) { - emit BeforeTransferHookTriggered(from, to, amount); + emit BeforeTransferHookTriggered(from, to, value); // Perform native transfers if configured if (transferAmount > 0 && (recipient1 != address(0) || recipient2 != address(0))) { @@ -143,7 +139,7 @@ contract ERC20WithNativeTransfers is Context, AccessControlEnumerable, ERC20Burn } } - super._beforeTokenTransfer(from, to, amount); + super._update(from, to, value); } receive() external payable {} diff --git a/contracts/solidity/ICS20TransferTester.json b/contracts/solidity/ICS20TransferTester.json index 9e51cb77f..43cd9d5ac 100644 --- a/contracts/solidity/ICS20TransferTester.json +++ b/contracts/solidity/ICS20TransferTester.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "ICS20TransferTester", "sourceName": "solidity/ICS20TransferTester.sol", "abi": [ @@ -210,8 +210,11 @@ "type": "receive" } ], - "bytecode": "0x6080806040523461001657610826908161001c8239f35b600080fdfe60806040815260c0604052600480361015610024575b5050361561002257600080fd5b005b60a0916000835260003560e01c8063339b204d14610319578381635627cd7d14610118575063c489744b146100595750610015565b346100f45780519182600319360112610113576001600160a01b038135818116949085900361010e5760243591821680920361010e57516370a0823160e01b81529182015291602090839060249082905afa918215610101578351926100c5575b602083835151908152f35b9091506020813d82116100f9575b816100e0602093836104c2565b810103126100f457602092505190386100ba565b825180fd5b3d91506100d3565b81515184513d90823e3d90fd5b855180fd5b835180fd5b828185346103145761012936610551565b8c515163a9059cbb60e01b81526001600160a01b03998a168c820190815260208082019a909a528d51949d959c999b969a8c9a9899989697939694958f95948c938593908490036040019284929091165af1809651916101ca976102e5575b506102a057506000805160206107d18339815191528d5151806101aa816106a6565b0390a15b8a8d5151998a98899863632535b960e01b8a5230948a01610736565b038189516108025af1801561029357917f6584ffa41ce5e25ea3ea0164e8171d3c01993df4e6a56d6a8bc2e731d6ea641393916000805160206107d1833981519152969593610266575b5084519161022c8351948594855287518501906106f6565b918301520390a151516040808252600e908201526d34b1b999182fba3930b739b332b960911b606082015260016020820152608090a15180f35b61028590823d841161028c575b61027d81836104c2565b8101906106d6565b5087610214565b503d610273565b85515187513d90823e3d90fd5b156102c9576000805160206107d18339815191528d5151806102c181610676565b0390a16101ae565b6000805160206107d18339815191528d5151806102c1816106a6565b6103069192508a3d8c1161030d575b6102fe81836104c2565b81019061065e565b9038610188565b503d6102f4565b505180fd5b50346104bd5781908361036f61032e36610551565b95968c9e939a929b91959899949e515194858094819363a9059cbb60e01b835260209d8e98840160209093929193604081019460018060a01b031681520152565b9351930392906001600160a01b03165af19081156104b0578c5191610493575b501561045757849392916103dd91888a51519b6000805160206107d18339815191528d80829f6103be90610676565b0390a1898c51519e8f98899863632535b960e01b8a5230948a01610736565b03818a516108025af195861561044a577f6584ffa41ce5e25ea3ea0164e8171d3c01993df4e6a56d6a8bc2e731d6ea641394959661042d575084519161022c8351948594855287518501906106f6565b61044390823d841161028c5761027d81836104c2565b5038610214565b84515188513d90823e3d90fd5b87515162461bcd60e51b8152808a018690526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606490fd5b6104aa9150863d881161030d576102fe81836104c2565b3861038f565b8951518d513d90823e3d90fd5b600080fd5b90601f8019910116810190811067ffffffffffffffff8211176104e457604052565b634e487b7160e01b600052604160045260246000fd5b81601f820112156104bd5780359067ffffffffffffffff82116104e4576040519261052f601f8401601f1916602001856104c2565b828452602083830101116104bd57816000926020809301838601378301015290565b906101606003198301126104bd576001600160a01b039160049190823584811681036104bd579360243590811681036104bd57926044359267ffffffffffffffff916064358381116104bd57846105a99183016104fa565b936084358481116104bd57816105c09184016104fa565b9360a4358181116104bd57826105d79185016104fa565b9360c4359360e4358381116104bd576105f48560409284016104fa565b946101031901126104bd576040519060408201908282108583111761064957506040526101043583811681036104bd5781526101243583811681036104bd576020820152916101443590811681036104bd5790565b604190634e487b7160e01b6000525260246000fd5b908160209103126104bd575180151581036104bd5790565b9060408252600e60408301526d32b93199182fba3930b739b332b960911b60608301526001602060808401930152565b9060408252600e60408301526d32b93199182fba3930b739b332b960911b60608301526000602060808401930152565b908160209103126104bd575167ffffffffffffffff811681036104bd5790565b919082519283825260005b848110610722575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610701565b95909461077761079a9461076960209b979561075c8d9a8c6101408091528d01906106f6565b908b82038b8d01526106f6565b9089820360408b01526106f6565b60608801939093526001600160a01b0316608087015285820360a08701526106f6565b9367ffffffffffffffff9281848093511660c087015201511660e08401521661010082015261012081830391015260008152019056fe9f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a2646970667358221220e3b797d81d6dda237d7831efb120a36c1b5eefb96ce60e657de14baae6c6a31764736f6c63430008140033", - "deployedBytecode": "0x60806040815260c0604052600480361015610024575b5050361561002257600080fd5b005b60a0916000835260003560e01c8063339b204d14610319578381635627cd7d14610118575063c489744b146100595750610015565b346100f45780519182600319360112610113576001600160a01b038135818116949085900361010e5760243591821680920361010e57516370a0823160e01b81529182015291602090839060249082905afa918215610101578351926100c5575b602083835151908152f35b9091506020813d82116100f9575b816100e0602093836104c2565b810103126100f457602092505190386100ba565b825180fd5b3d91506100d3565b81515184513d90823e3d90fd5b855180fd5b835180fd5b828185346103145761012936610551565b8c515163a9059cbb60e01b81526001600160a01b03998a168c820190815260208082019a909a528d51949d959c999b969a8c9a9899989697939694958f95948c938593908490036040019284929091165af1809651916101ca976102e5575b506102a057506000805160206107d18339815191528d5151806101aa816106a6565b0390a15b8a8d5151998a98899863632535b960e01b8a5230948a01610736565b038189516108025af1801561029357917f6584ffa41ce5e25ea3ea0164e8171d3c01993df4e6a56d6a8bc2e731d6ea641393916000805160206107d1833981519152969593610266575b5084519161022c8351948594855287518501906106f6565b918301520390a151516040808252600e908201526d34b1b999182fba3930b739b332b960911b606082015260016020820152608090a15180f35b61028590823d841161028c575b61027d81836104c2565b8101906106d6565b5087610214565b503d610273565b85515187513d90823e3d90fd5b156102c9576000805160206107d18339815191528d5151806102c181610676565b0390a16101ae565b6000805160206107d18339815191528d5151806102c1816106a6565b6103069192508a3d8c1161030d575b6102fe81836104c2565b81019061065e565b9038610188565b503d6102f4565b505180fd5b50346104bd5781908361036f61032e36610551565b95968c9e939a929b91959899949e515194858094819363a9059cbb60e01b835260209d8e98840160209093929193604081019460018060a01b031681520152565b9351930392906001600160a01b03165af19081156104b0578c5191610493575b501561045757849392916103dd91888a51519b6000805160206107d18339815191528d80829f6103be90610676565b0390a1898c51519e8f98899863632535b960e01b8a5230948a01610736565b03818a516108025af195861561044a577f6584ffa41ce5e25ea3ea0164e8171d3c01993df4e6a56d6a8bc2e731d6ea641394959661042d575084519161022c8351948594855287518501906106f6565b61044390823d841161028c5761027d81836104c2565b5038610214565b84515188513d90823e3d90fd5b87515162461bcd60e51b8152808a018690526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606490fd5b6104aa9150863d881161030d576102fe81836104c2565b3861038f565b8951518d513d90823e3d90fd5b600080fd5b90601f8019910116810190811067ffffffffffffffff8211176104e457604052565b634e487b7160e01b600052604160045260246000fd5b81601f820112156104bd5780359067ffffffffffffffff82116104e4576040519261052f601f8401601f1916602001856104c2565b828452602083830101116104bd57816000926020809301838601378301015290565b906101606003198301126104bd576001600160a01b039160049190823584811681036104bd579360243590811681036104bd57926044359267ffffffffffffffff916064358381116104bd57846105a99183016104fa565b936084358481116104bd57816105c09184016104fa565b9360a4358181116104bd57826105d79185016104fa565b9360c4359360e4358381116104bd576105f48560409284016104fa565b946101031901126104bd576040519060408201908282108583111761064957506040526101043583811681036104bd5781526101243583811681036104bd576020820152916101443590811681036104bd5790565b604190634e487b7160e01b6000525260246000fd5b908160209103126104bd575180151581036104bd5790565b9060408252600e60408301526d32b93199182fba3930b739b332b960911b60608301526001602060808401930152565b9060408252600e60408301526d32b93199182fba3930b739b332b960911b60608301526000602060808401930152565b908160209103126104bd575167ffffffffffffffff811681036104bd5790565b919082519283825260005b848110610722575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610701565b95909461077761079a9461076960209b979561075c8d9a8c6101408091528d01906106f6565b908b82038b8d01526106f6565b9089820360408b01526106f6565b60608801939093526001600160a01b0316608087015285820360a08701526106f6565b9367ffffffffffffffff9281848093511660c087015201511660e08401521661010082015261012081830391015260008152019056fe9f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a2646970667358221220e3b797d81d6dda237d7831efb120a36c1b5eefb96ce60e657de14baae6c6a31764736f6c63430008140033", + "bytecode": "0x6080806040523460155761073c908161001a8239f35b5f80fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c8063339b204d146102d25780635627cd7d146100f15763c489744b0361000e57346100da5760403660031901126100da576004356001600160a01b038116908190036100da576024356001600160a01b038116908190036100da576020906024604051809481936370a0823160e01b835260048301525afa80156100e6575f906100af575b602090604051908152f35b506020813d6020116100de575b816100c9602093836103c9565b810103126100da57602090516100a4565b5f80fd5b3d91506100bc565b6040513d5f823e3d90fd5b346100da5761019f60206101488161010836610453565b95929c96829b9294998e9d9296995f60405180968195829463a9059cbb60e01b84526004840160209093929193604081019460018060a01b031681520152565b03926001600160a01b03165af15f91816102a3575b5061026057505f805160206106e78339815191526040518061017e816105c3565b0390a15b60405163632535b960e01b81529a8b978897309360048a01610635565b03815f6108025af19283156100e6577f6584ffa41ce5e25ea3ea0164e8171d3c01993df4e6a56d6a8bc2e731d6ea641393610233575b506101e5604051928392836106ca565b0390a15f805160206106e78339815191526040518061022e819060408252600e60408301526d34b1b999182fba3930b739b332b960911b60608301526001602060808401930152565b0390a1005b6102549060203d602011610259575b61024c81836103c9565b8101906105f2565b6101d5565b503d610242565b15610288575f805160206106e78339815191526040518061028081610593565b0390a1610182565b5f805160206106e783398151915260405180610280816105c3565b6102c49192508a3d8c116102cb575b6102bc81836103c9565b81019061057b565b908d61015d565b503d6102b2565b346100da5760206103276102e536610453565b60405163a9059cbb60e01b81526001600160a01b0390991660048a015260248901979097529199959890979196929593949391839182905f9082906044820190565b03926001600160a01b03165af19081156100e6575f916103aa575b501561036d5786956020948661019f935f805160206106e78339815191526040518061017e81610593565b60405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606490fd5b6103c3915060203d6020116102cb576102bc81836103c9565b88610342565b90601f801991011681019081106001600160401b038211176103ea57604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156100da578035906001600160401b0382116103ea5760405192610432601f8401601f1916602001856103c9565b828452602083830101116100da57815f926020809301838601378301015290565b6101606003198201126100da576004356001600160a01b03811681036100da57916024356001600160a01b03811681036100da5791604435916064356001600160401b0381116100da57826104aa916004016103fe565b916084356001600160401b0381116100da57816104c9916004016103fe565b9160a4356001600160401b0381116100da57826104e8916004016103fe565b9160c4359160e4356001600160401b0381116100da5761050d836040926004016103fe565b926101031901126100da57604051604081018181106001600160401b038211176103ea57604052610104356001600160401b03811681036100da578152610124356001600160401b03811681036100da57602082015290610144356001600160401b03811681036100da5790565b908160209103126100da575180151581036100da5790565b9060408252600e60408301526d32b93199182fba3930b739b332b960911b60608301526001602060808401930152565b9060408252600e60408301526d32b93199182fba3930b739b332b960911b60608301525f602060808401930152565b908160209103126100da57516001600160401b03811681036100da5790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9593602098946001600160401b039661067e88966106708d976106636106a1986101408f8181520190610611565b8d81038a8f015290610611565b908b820360408d0152610611565b60608a01939093526001600160a01b0316608089015287820360a0890152610611565b958281511660c087015201511660e0840152166101008201526101208183039101525f81520190565b9291906106e1602091604086526040860190610611565b93015256fe9f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a26469706673582212201dbbbff5f2cb432479d1c95e04126fe6a976c7b02a7aade5096d78a3dfce2b3164736f6c634300081a0033", + "deployedBytecode": "0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c8063339b204d146102d25780635627cd7d146100f15763c489744b0361000e57346100da5760403660031901126100da576004356001600160a01b038116908190036100da576024356001600160a01b038116908190036100da576020906024604051809481936370a0823160e01b835260048301525afa80156100e6575f906100af575b602090604051908152f35b506020813d6020116100de575b816100c9602093836103c9565b810103126100da57602090516100a4565b5f80fd5b3d91506100bc565b6040513d5f823e3d90fd5b346100da5761019f60206101488161010836610453565b95929c96829b9294998e9d9296995f60405180968195829463a9059cbb60e01b84526004840160209093929193604081019460018060a01b031681520152565b03926001600160a01b03165af15f91816102a3575b5061026057505f805160206106e78339815191526040518061017e816105c3565b0390a15b60405163632535b960e01b81529a8b978897309360048a01610635565b03815f6108025af19283156100e6577f6584ffa41ce5e25ea3ea0164e8171d3c01993df4e6a56d6a8bc2e731d6ea641393610233575b506101e5604051928392836106ca565b0390a15f805160206106e78339815191526040518061022e819060408252600e60408301526d34b1b999182fba3930b739b332b960911b60608301526001602060808401930152565b0390a1005b6102549060203d602011610259575b61024c81836103c9565b8101906105f2565b6101d5565b503d610242565b15610288575f805160206106e78339815191526040518061028081610593565b0390a1610182565b5f805160206106e783398151915260405180610280816105c3565b6102c49192508a3d8c116102cb575b6102bc81836103c9565b81019061057b565b908d61015d565b503d6102b2565b346100da5760206103276102e536610453565b60405163a9059cbb60e01b81526001600160a01b0390991660048a015260248901979097529199959890979196929593949391839182905f9082906044820190565b03926001600160a01b03165af19081156100e6575f916103aa575b501561036d5786956020948661019f935f805160206106e78339815191526040518061017e81610593565b60405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606490fd5b6103c3915060203d6020116102cb576102bc81836103c9565b88610342565b90601f801991011681019081106001600160401b038211176103ea57604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156100da578035906001600160401b0382116103ea5760405192610432601f8401601f1916602001856103c9565b828452602083830101116100da57815f926020809301838601378301015290565b6101606003198201126100da576004356001600160a01b03811681036100da57916024356001600160a01b03811681036100da5791604435916064356001600160401b0381116100da57826104aa916004016103fe565b916084356001600160401b0381116100da57816104c9916004016103fe565b9160a4356001600160401b0381116100da57826104e8916004016103fe565b9160c4359160e4356001600160401b0381116100da5761050d836040926004016103fe565b926101031901126100da57604051604081018181106001600160401b038211176103ea57604052610104356001600160401b03811681036100da578152610124356001600160401b03811681036100da57602082015290610144356001600160401b03811681036100da5790565b908160209103126100da575180151581036100da5790565b9060408252600e60408301526d32b93199182fba3930b739b332b960911b60608301526001602060808401930152565b9060408252600e60408301526d32b93199182fba3930b739b332b960911b60608301525f602060808401930152565b908160209103126100da57516001600160401b03811681036100da5790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9593602098946001600160401b039661067e88966106708d976106636106a1986101408f8181520190610611565b8d81038a8f015290610611565b908b820360408d0152610611565b60608a01939093526001600160a01b0316608089015287820360a0890152610611565b958281511660c087015201511660e0840152166101008201526101208183039101525f81520190565b9291906106e1602091604086526040860190610611565b93015256fe9f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a26469706673582212201dbbbff5f2cb432479d1c95e04126fe6a976c7b02a7aade5096d78a3dfce2b3164736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/ICS20TransferTester.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/contracts/solidity/ICS20TransferTester.sol b/contracts/solidity/ICS20TransferTester.sol index 39c466a8b..20cb84c3d 100644 --- a/contracts/solidity/ICS20TransferTester.sol +++ b/contracts/solidity/ICS20TransferTester.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import "./precompiles/ics20/ICS20I.sol"; -import "./precompiles/erc20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./precompiles/staking/StakingI.sol"; import "./precompiles/common/Types.sol"; diff --git a/contracts/solidity/SequentialICS20Sender.json b/contracts/solidity/SequentialICS20Sender.json index 95270047f..1ac3cf3f0 100644 --- a/contracts/solidity/SequentialICS20Sender.json +++ b/contracts/solidity/SequentialICS20Sender.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "SequentialICS20Sender", "sourceName": "solidity/SequentialICS20Sender.sol", "abi": [ @@ -161,8 +161,11 @@ "type": "function" } ], - "bytecode": "0x6080806040523461001657610581908161001c8239f35b600080fdfe6040608081526004908136101561001557600080fd5b600090813560e01c806365ab4537146100d45763f8b2cb4f1461003757600080fd5b346100d057602092836003193601126100cc57836001600160a01b0361005b61038d565b169160248451809481936370a0823160e01b835230908301525afa9283156100c157809361008c575b505051908152f35b909192508382813d83116100ba575b6100a581836103da565b810103126100b7575051903880610084565b80fd5b503d61009b565b8251903d90823e3d90fd5b8280fd5b5080fd5b508290346100cc5760e03660031901126100cc576100f061038d565b67ffffffffffffffff91906024358381116103895761011290369086016103fc565b906044358481116103855761012a90369087016103fc565b906064358581116103815761014290369088016103fc565b9260843586811161037d5761015a90369089016103fc565b9560a43590811680910361037d5785516323b872dd60e01b8152338982015230602482015260c43560448201819052602098909490916001600160a01b039091169089816064818f865af1908115610373578c91610339575b5015610301578389969594938c9389938b519081528b888b8301527f5a0ebf9442637ca6e817894481a6de0c29715a73efc9e02bb7ef4ed52843362d91a18c8b516101fd816103a8565b60018152838b8201528c51948591848c8c63632535b960e01b9a8b8752309288880196610229976104b3565b03978a856108029a818a8d5af194610269956102e4575b508c519361024d856103a8565b600185528b8501528c519b8c9a8b998a988952309489016104b3565b03925af190816102b7575b506102b3575162461bcd60e51b815291820152601660248201527514d958dbdb9908151c985b9cd9995c8811985a5b195960521b604482015260649150fd5b8380f35b6102d690843d86116102dd575b6102ce81836103da565b810190610453565b5085610274565b503d6102c4565b6102fa908c8d3d106102dd576102ce81836103da565b5038610240565b875162461bcd60e51b8152808b018a90526012602482015271151c985b9cd9995c881a5b8819985a5b195960721b6044820152606490fd5b90508981813d831161036c575b61035081836103da565b8101031261036857518015158103610368578c6101b3565b8b80fd5b503d610346565b89513d8e823e3d90fd5b8880fd5b8780fd5b8680fd5b8580fd5b600435906001600160a01b03821682036103a357565b600080fd5b6040810190811067ffffffffffffffff8211176103c457604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176103c457604052565b81601f820112156103a35780359067ffffffffffffffff82116103c45760405192610431601f8401601f1916602001856103da565b828452602083830101116103a357816000926020809301838601378301015290565b908160209103126103a3575167ffffffffffffffff811681036103a35790565b919082519283825260005b84811061049f575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161047e565b949061051594936104e460209998946104d76104f294610140808c528b0190610473565b908982038c8b0152610473565b908782036040890152610473565b60608601939093526001600160a01b0316608085015283820360a0850152610473565b918367ffffffffffffffff918281511660c085015201511660e0820152600061010082015261012081830391015260008152019056fea26469706673582212205e4dfe16435cdbcf4051376984524968aeb3cd20e6678b3eee0c9c4e0db664b564736f6c63430008140033", - "deployedBytecode": "0x6040608081526004908136101561001557600080fd5b600090813560e01c806365ab4537146100d45763f8b2cb4f1461003757600080fd5b346100d057602092836003193601126100cc57836001600160a01b0361005b61038d565b169160248451809481936370a0823160e01b835230908301525afa9283156100c157809361008c575b505051908152f35b909192508382813d83116100ba575b6100a581836103da565b810103126100b7575051903880610084565b80fd5b503d61009b565b8251903d90823e3d90fd5b8280fd5b5080fd5b508290346100cc5760e03660031901126100cc576100f061038d565b67ffffffffffffffff91906024358381116103895761011290369086016103fc565b906044358481116103855761012a90369087016103fc565b906064358581116103815761014290369088016103fc565b9260843586811161037d5761015a90369089016103fc565b9560a43590811680910361037d5785516323b872dd60e01b8152338982015230602482015260c43560448201819052602098909490916001600160a01b039091169089816064818f865af1908115610373578c91610339575b5015610301578389969594938c9389938b519081528b888b8301527f5a0ebf9442637ca6e817894481a6de0c29715a73efc9e02bb7ef4ed52843362d91a18c8b516101fd816103a8565b60018152838b8201528c51948591848c8c63632535b960e01b9a8b8752309288880196610229976104b3565b03978a856108029a818a8d5af194610269956102e4575b508c519361024d856103a8565b600185528b8501528c519b8c9a8b998a988952309489016104b3565b03925af190816102b7575b506102b3575162461bcd60e51b815291820152601660248201527514d958dbdb9908151c985b9cd9995c8811985a5b195960521b604482015260649150fd5b8380f35b6102d690843d86116102dd575b6102ce81836103da565b810190610453565b5085610274565b503d6102c4565b6102fa908c8d3d106102dd576102ce81836103da565b5038610240565b875162461bcd60e51b8152808b018a90526012602482015271151c985b9cd9995c881a5b8819985a5b195960721b6044820152606490fd5b90508981813d831161036c575b61035081836103da565b8101031261036857518015158103610368578c6101b3565b8b80fd5b503d610346565b89513d8e823e3d90fd5b8880fd5b8780fd5b8680fd5b8580fd5b600435906001600160a01b03821682036103a357565b600080fd5b6040810190811067ffffffffffffffff8211176103c457604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176103c457604052565b81601f820112156103a35780359067ffffffffffffffff82116103c45760405192610431601f8401601f1916602001856103da565b828452602083830101116103a357816000926020809301838601378301015290565b908160209103126103a3575167ffffffffffffffff811681036103a35790565b919082519283825260005b84811061049f575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161047e565b949061051594936104e460209998946104d76104f294610140808c528b0190610473565b908982038c8b0152610473565b908782036040890152610473565b60608601939093526001600160a01b0316608085015283820360a0850152610473565b918367ffffffffffffffff918281511660c085015201511660e0820152600061010082015261012081830391015260008152019056fea26469706673582212205e4dfe16435cdbcf4051376984524968aeb3cd20e6678b3eee0c9c4e0db664b564736f6c63430008140033", + "bytecode": "0x6080806040523460155761054a908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806365ab4537146100c85763f8b2cb4f1461002f575f80fd5b346100b15760203660031901126100b157602460206001600160a01b03610054610380565b16604051928380926370a0823160e01b82523060048301525afa80156100bd575f90610086575b602090604051908152f35b506020813d6020116100b5575b816100a0602093836103c5565b810103126100b1576020905161007b565b5f80fd5b3d9150610093565b6040513d5f823e3d90fd5b346100b15760e03660031901126100b1576100e1610380565b6024356001600160401b0381116100b1576101009036906004016103e6565b6044356001600160401b0381116100b15761011f9036906004016103e6565b6064356001600160401b0381116100b15761013e9036906004016103e6565b906084356001600160401b0381116100b15761015e9036906004016103e6565b60a4356001600160401b0381168091036100b1576040516323b872dd60e01b815233600482015230602482015260c43560448201819052966001600160a01b031692906020816064815f885af19081156100bd575f91610345575b501561030b576020957f5a0ebf9442637ca6e817894481a6de0c29715a73efc9e02bb7ef4ed52843362d604061026f9581519081528a8a820152a18487898861022f60405161020781610396565b60018152888582015287604051968795869563632535b960e01b875230928b6004890161047e565b03815f6108025af16102f0575b506040519261024a84610396565b600184528784015260405163632535b960e01b8152978896879630936004890161047e565b03815f6108025af190816102c3575b506102c15760405162461bcd60e51b815260206004820152601660248201527514d958dbdb9908151c985b9cd9995c8811985a5b195960521b6044820152606490fd5b005b6102e49060203d6020116102e9575b6102dc81836103c5565b81019061043b565b61027e565b503d6102d2565b61030690883d8a116102e9576102dc81836103c5565b61023c565b60405162461bcd60e51b8152602060048201526012602482015271151c985b9cd9995c881a5b8819985a5b195960721b6044820152606490fd5b90506020813d602011610378575b81610360602093836103c5565b810103126100b1575180151581036100b157886101b9565b3d9150610353565b600435906001600160a01b03821682036100b157565b604081019081106001600160401b038211176103b157604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b038211176103b157604052565b81601f820112156100b1578035906001600160401b0382116103b1576040519261041a601f8401601f1916602001856103c5565b828452602083830101116100b157815f926020809301838601378301015290565b908160209103126100b157516001600160401b03811681036100b15790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9495602097966104c889956104ba6104eb966104ad6001600160401b039a976101408d526101408d019061045a565b908b82038a8d015261045a565b9089820360408b015261045a565b60608801939093526001600160a01b0316608087015285820360a087015261045a565b938281511660c085015201511660e08201525f6101008201526101208183039101525f8152019056fea2646970667358221220a103f3843611bd44b45fe6f4b6f82f6f155b35f15f11e3b80cbc23a74e13ace664736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c806365ab4537146100c85763f8b2cb4f1461002f575f80fd5b346100b15760203660031901126100b157602460206001600160a01b03610054610380565b16604051928380926370a0823160e01b82523060048301525afa80156100bd575f90610086575b602090604051908152f35b506020813d6020116100b5575b816100a0602093836103c5565b810103126100b1576020905161007b565b5f80fd5b3d9150610093565b6040513d5f823e3d90fd5b346100b15760e03660031901126100b1576100e1610380565b6024356001600160401b0381116100b1576101009036906004016103e6565b6044356001600160401b0381116100b15761011f9036906004016103e6565b6064356001600160401b0381116100b15761013e9036906004016103e6565b906084356001600160401b0381116100b15761015e9036906004016103e6565b60a4356001600160401b0381168091036100b1576040516323b872dd60e01b815233600482015230602482015260c43560448201819052966001600160a01b031692906020816064815f885af19081156100bd575f91610345575b501561030b576020957f5a0ebf9442637ca6e817894481a6de0c29715a73efc9e02bb7ef4ed52843362d604061026f9581519081528a8a820152a18487898861022f60405161020781610396565b60018152888582015287604051968795869563632535b960e01b875230928b6004890161047e565b03815f6108025af16102f0575b506040519261024a84610396565b600184528784015260405163632535b960e01b8152978896879630936004890161047e565b03815f6108025af190816102c3575b506102c15760405162461bcd60e51b815260206004820152601660248201527514d958dbdb9908151c985b9cd9995c8811985a5b195960521b6044820152606490fd5b005b6102e49060203d6020116102e9575b6102dc81836103c5565b81019061043b565b61027e565b503d6102d2565b61030690883d8a116102e9576102dc81836103c5565b61023c565b60405162461bcd60e51b8152602060048201526012602482015271151c985b9cd9995c881a5b8819985a5b195960721b6044820152606490fd5b90506020813d602011610378575b81610360602093836103c5565b810103126100b1575180151581036100b157886101b9565b3d9150610353565b600435906001600160a01b03821682036100b157565b604081019081106001600160401b038211176103b157604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b038211176103b157604052565b81601f820112156100b1578035906001600160401b0382116103b1576040519261041a601f8401601f1916602001856103c5565b828452602083830101116100b157815f926020809301838601378301015290565b908160209103126100b157516001600160401b03811681036100b15790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9495602097966104c889956104ba6104eb966104ad6001600160401b039a976101408d526101408d019061045a565b908b82038a8d015261045a565b9089820360408b015261045a565b60608801939093526001600160a01b0316608087015285820360a087015261045a565b938281511660c085015201511660e08201525f6101008201526101208183039101525f8152019056fea2646970667358221220a103f3843611bd44b45fe6f4b6f82f6f155b35f15f11e3b80cbc23a74e13ace664736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/SequentialICS20Sender.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/contracts/solidity/SequentialICS20Sender.sol b/contracts/solidity/SequentialICS20Sender.sol index db73679ab..119169479 100644 --- a/contracts/solidity/SequentialICS20Sender.sol +++ b/contracts/solidity/SequentialICS20Sender.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import "./precompiles/ics20/ICS20I.sol"; -import "./precompiles/erc20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./precompiles/common/Types.sol"; /** diff --git a/contracts/solidity/SequentialOperationsTester.json b/contracts/solidity/SequentialOperationsTester.json index 1d7de80a9..3906a8c9a 100644 --- a/contracts/solidity/SequentialOperationsTester.json +++ b/contracts/solidity/SequentialOperationsTester.json @@ -267,11 +267,11 @@ "type": "receive" } ], - "bytecode": "0x6080806040523461001657610ab0908161001b8239f35b5f80fdfe6040608081526004908136101561001f575b5050361561001d575f80fd5b005b5f91823560e01c908163456503c8146105625781635b3d97d5146104a05781635c3f86c9146103875781636e348ad6146101ad5781636f9fb98a14610192578163c489744b146100e257508063e1f756c3146100a75763efd8be620361001157346100a35760203660031901126100a35760209061009b610692565b319051908152f35b5080fd5b50806003193601126100a3578180806020946100c1610692565b602435906001600160a01b03165af1906100d9610961565b50519015158152f35b919050346101785780600319360112610178576100fd610692565b916024356001600160a01b038181169182900361018e57602092602491855196879485936370a0823160e01b8552840152165afa918215610184578392610149575b6020838351908152f35b9091506020813d821161017c575b81610164602093836106ac565b81010312610178576020925051905f61013f565b8280fd5b3d9150610157565b81513d85823e3d90fd5b8580fd5b5050346100a357816003193601126100a35751478152602090f35b905034610178576101bd36610744565b865163a9059cbb60e01b8082526001600160a01b038681168984019081526020808201889052949a959995989497959490911693928b9291889082908190604001038186895af190811561037d579a610222899261025c9d8691610360575b50610800565b89519a5f80516020610a5b8339815191528c8061023f839f610844565b0390a18a516353266bbb60e01b81529c8d9283923089850161086f565b0381856108005af1998a15610356578798999a979697610339575b5089895180610285816108c9565b0390a16102b28951978896879586948552840160209093929193604081019460018060a01b031681520152565b03925af191821561032f57906102d192918692610302575b505061091c565b516040808252600990820152683a3930b739b332b91960b91b60608201526001602082015280608081015b0390a180f35b6103219250803d10610328575b61031981836106ac565b8101906107e8565b5f806102ca565b503d61030f565b83513d87823e3d90fd5b61034f90873d89116103285761031981836106ac565b505f610277565b88513d84823e3d90fd5b6103779150843d86116103285761031981836106ac565b5f61021c565b89513d85823e3d90fd5b91905061043783808080602061039c3661079e565b91936001600160a01b0390931692906103c48680808089895af16103be610961565b50610990565b8a519b5f80516020610a5b8339815191528d80829f6103e2906109dc565b0390a16104028c5194859384936353266bbb60e01b85523090850161086f565b0381876108005af19081610482575b5061046d5788885180610423816108f3565b0390a15b5af1610431610961565b50610a0e565b5160408082526010908201526f3730ba34bb32afba3930b739b332b91960811b60608201526001602082015280608081016102fc565b8888518061047a816108c9565b0390a1610427565b6104999060203d81116103285761031981836106ac565b505f610411565b9190508260206104af3661079e565b91936001600160a01b0390931692906104d18680808089895af16103be610961565b8651975f80516020610a5b83398151915289806104ee839c6109dc565b0390a161050e885194859384936353266bbb60e01b85523090850161086f565b0381876108005af1801561055857938093819382936104379761053a575b5088885180610423816108c9565b6105519060203d81116103285761031981836106ac565b505f61052c565b85513d86823e3d90fd5b9050346101785761057236610744565b865163a9059cbb60e01b8082526001600160a01b038681168984019081526020808201889052949a959995989497959490911693928b9291889082908190604001038186895af190811561037d579780999a9b6105db61061593839a9b87916103605750610800565b8b519c5f80516020610a5b8339815191528e819f6105f881610844565b0390a18c516353266bbb60e01b81529384928392308a850161086f565b0381866108005af19081610675575b506106605789895180610285816108f3565b6102b28951978896879586948552840160209093929193604081019460018060a01b031681520152565b8989518061066d816108c9565b0390a1610636565b61068b90883d8a116103285761031981836106ac565b505f610624565b600435906001600160a01b03821682036106a857565b5f80fd5b90601f8019910116810190811067ffffffffffffffff8211176106ce57604052565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff81116106ce57601f01601f191660200190565b81601f820112156106a857803590610715826106e2565b9261072360405194856106ac565b828452602083830101116106a857815f926020809301838601378301015290565b9060a06003198301126106a8576001600160a01b039160043583811681036106a8579260243590811681036106a85791604435916064359067ffffffffffffffff82116106a857610797916004016106fe565b9060843590565b60806003198201126106a8576004356001600160a01b03811681036106a85791602435916044359067ffffffffffffffff82116106a8576107e1916004016106fe565b9060643590565b908160209103126106a8575180151581036106a85790565b1561080757565b60405162461bcd60e51b8152602060048201526015602482015274119a5c9cdd081d1c985b9cd9995c8819985a5b1959605a1b6044820152606490fd5b906040825260096040830152687472616e736665723160b81b60608301526001602060808401930152565b9392919060018060a01b0316845260206060818601528151918260608701525f5b8381106108b5575050506080815f8260409488010152601f8019910116850101930152565b818101830151878201608001528201610890565b9060408252600860408301526764656c656761746560c01b60608301526001602060808401930152565b9060408252600860408301526764656c656761746560c01b60608301525f602060808401930152565b1561092357565b60405162461bcd60e51b815260206004820152601660248201527514d958dbdb99081d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b3d1561098b573d90610972826106e2565b9161098060405193846106ac565b82523d5f602084013e565b606090565b1561099757565b60405162461bcd60e51b815260206004820152601c60248201527f4669727374206e6174697665207472616e73666572206661696c6564000000006044820152606490fd5b9060408252601060408301526f6e61746976655f7472616e736665723160801b60608301526001602060808401930152565b15610a1557565b60405162461bcd60e51b815260206004820152601d60248201527f5365636f6e64206e6174697665207472616e73666572206661696c65640000006044820152606490fdfe9f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a26469706673582212209828da0fad34acc382c5f6e2e016ef5f88bf747fdacc2b9ec5f0431514fe5aba64736f6c63430008140033", - "deployedBytecode": "0x6040608081526004908136101561001f575b5050361561001d575f80fd5b005b5f91823560e01c908163456503c8146105625781635b3d97d5146104a05781635c3f86c9146103875781636e348ad6146101ad5781636f9fb98a14610192578163c489744b146100e257508063e1f756c3146100a75763efd8be620361001157346100a35760203660031901126100a35760209061009b610692565b319051908152f35b5080fd5b50806003193601126100a3578180806020946100c1610692565b602435906001600160a01b03165af1906100d9610961565b50519015158152f35b919050346101785780600319360112610178576100fd610692565b916024356001600160a01b038181169182900361018e57602092602491855196879485936370a0823160e01b8552840152165afa918215610184578392610149575b6020838351908152f35b9091506020813d821161017c575b81610164602093836106ac565b81010312610178576020925051905f61013f565b8280fd5b3d9150610157565b81513d85823e3d90fd5b8580fd5b5050346100a357816003193601126100a35751478152602090f35b905034610178576101bd36610744565b865163a9059cbb60e01b8082526001600160a01b038681168984019081526020808201889052949a959995989497959490911693928b9291889082908190604001038186895af190811561037d579a610222899261025c9d8691610360575b50610800565b89519a5f80516020610a5b8339815191528c8061023f839f610844565b0390a18a516353266bbb60e01b81529c8d9283923089850161086f565b0381856108005af1998a15610356578798999a979697610339575b5089895180610285816108c9565b0390a16102b28951978896879586948552840160209093929193604081019460018060a01b031681520152565b03925af191821561032f57906102d192918692610302575b505061091c565b516040808252600990820152683a3930b739b332b91960b91b60608201526001602082015280608081015b0390a180f35b6103219250803d10610328575b61031981836106ac565b8101906107e8565b5f806102ca565b503d61030f565b83513d87823e3d90fd5b61034f90873d89116103285761031981836106ac565b505f610277565b88513d84823e3d90fd5b6103779150843d86116103285761031981836106ac565b5f61021c565b89513d85823e3d90fd5b91905061043783808080602061039c3661079e565b91936001600160a01b0390931692906103c48680808089895af16103be610961565b50610990565b8a519b5f80516020610a5b8339815191528d80829f6103e2906109dc565b0390a16104028c5194859384936353266bbb60e01b85523090850161086f565b0381876108005af19081610482575b5061046d5788885180610423816108f3565b0390a15b5af1610431610961565b50610a0e565b5160408082526010908201526f3730ba34bb32afba3930b739b332b91960811b60608201526001602082015280608081016102fc565b8888518061047a816108c9565b0390a1610427565b6104999060203d81116103285761031981836106ac565b505f610411565b9190508260206104af3661079e565b91936001600160a01b0390931692906104d18680808089895af16103be610961565b8651975f80516020610a5b83398151915289806104ee839c6109dc565b0390a161050e885194859384936353266bbb60e01b85523090850161086f565b0381876108005af1801561055857938093819382936104379761053a575b5088885180610423816108c9565b6105519060203d81116103285761031981836106ac565b505f61052c565b85513d86823e3d90fd5b9050346101785761057236610744565b865163a9059cbb60e01b8082526001600160a01b038681168984019081526020808201889052949a959995989497959490911693928b9291889082908190604001038186895af190811561037d579780999a9b6105db61061593839a9b87916103605750610800565b8b519c5f80516020610a5b8339815191528e819f6105f881610844565b0390a18c516353266bbb60e01b81529384928392308a850161086f565b0381866108005af19081610675575b506106605789895180610285816108f3565b6102b28951978896879586948552840160209093929193604081019460018060a01b031681520152565b8989518061066d816108c9565b0390a1610636565b61068b90883d8a116103285761031981836106ac565b505f610624565b600435906001600160a01b03821682036106a857565b5f80fd5b90601f8019910116810190811067ffffffffffffffff8211176106ce57604052565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff81116106ce57601f01601f191660200190565b81601f820112156106a857803590610715826106e2565b9261072360405194856106ac565b828452602083830101116106a857815f926020809301838601378301015290565b9060a06003198301126106a8576001600160a01b039160043583811681036106a8579260243590811681036106a85791604435916064359067ffffffffffffffff82116106a857610797916004016106fe565b9060843590565b60806003198201126106a8576004356001600160a01b03811681036106a85791602435916044359067ffffffffffffffff82116106a8576107e1916004016106fe565b9060643590565b908160209103126106a8575180151581036106a85790565b1561080757565b60405162461bcd60e51b8152602060048201526015602482015274119a5c9cdd081d1c985b9cd9995c8819985a5b1959605a1b6044820152606490fd5b906040825260096040830152687472616e736665723160b81b60608301526001602060808401930152565b9392919060018060a01b0316845260206060818601528151918260608701525f5b8381106108b5575050506080815f8260409488010152601f8019910116850101930152565b818101830151878201608001528201610890565b9060408252600860408301526764656c656761746560c01b60608301526001602060808401930152565b9060408252600860408301526764656c656761746560c01b60608301525f602060808401930152565b1561092357565b60405162461bcd60e51b815260206004820152601660248201527514d958dbdb99081d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b3d1561098b573d90610972826106e2565b9161098060405193846106ac565b82523d5f602084013e565b606090565b1561099757565b60405162461bcd60e51b815260206004820152601c60248201527f4669727374206e6174697665207472616e73666572206661696c6564000000006044820152606490fd5b9060408252601060408301526f6e61746976655f7472616e736665723160801b60608301526001602060808401930152565b15610a1557565b60405162461bcd60e51b815260206004820152601d60248201527f5365636f6e64206e6174697665207472616e73666572206661696c65640000006044820152606490fdfe9f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a26469706673582212209828da0fad34acc382c5f6e2e016ef5f88bf747fdacc2b9ec5f0431514fe5aba64736f6c63430008140033", + "bytecode": "0x60808060405234601557610aca908161001a8239f35b5f80fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c8063456503c8146105805780635b3d97d5146104bd5780635c3f86c9146103765780636e348ad6146101a45780636f9fb98a14610189578063c489744b146100da578063e1f756c31461009e5763efd8be620361000e573461009a57602036600319011261009a5760206100916106c4565b31604051908152f35b5f80fd5b604036600319011261009a5760205f8080806100b86106c4565b602435906001600160a01b03165af16100cf61097b565b506040519015158152f35b3461009a57604036600319011261009a576100f36106c4565b6024356001600160a01b0381169081900361009a576040516370a0823160e01b8152600481019190915290602090829060249082906001600160a01b03165afa801561017e575f9061014b575b602090604051908152f35b506020813d602011610176575b81610165602093836106da565b8101031261009a5760209051610140565b3d9150610158565b6040513d5f823e3d90fd5b3461009a575f36600319011261009a57602047604051908152f35b3461009a576101b236610772565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820185905290951691906020866044815f875af191821561017e5761020360209361023d985f91610359575b50610833565b5f80516020610a758339815191526040518061021e81610877565b0390a16040516353266bbb60e01b8152968792839230600485016108a2565b03815f6108005af192831561017e576102ae9460209461033e575b505f80516020610a7583398151915260405180610274816108e3565b0390a160405163a9059cbb60e01b81526001600160a01b0390911660048201526024810192909252909283919082905f9082906044820190565b03925af1801561017e576102c9915f9161030f575b50610936565b5f80516020610a758339815191526040518061030a81906040825260096040830152683a3930b739b332b91960b91b60608301526001602060808401930152565b0390a1005b610331915060203d602011610337575b61032981836106da565b81019061081b565b826102c3565b503d61031f565b61035490853d87116103375761032981836106da565b610258565b6103709150853d87116103375761032981836106da565b896101fd565b6104355f80808060206103ef61038b366107d1565b91946001600160a01b03909316939291906103b5878080808a8a5af16103af61097b565b506109aa565b5f80516020610a75833981519152604051806103d0816109f6565b0390a16040516353266bbb60e01b8152938492839230600485016108a2565b0381876108005af190816104a0575b5015831461047d575f80516020610a75833981519152604051806104218161090d565b0390a15b5af161042f61097b565b50610a28565b5f80516020610a758339815191526040518061030a819060408252601060408301526f3730ba34bb32afba3930b739b332b91960811b60608301526001602060808401930152565b5f80516020610a7583398151915260405180610498816108e3565b0390a1610425565b6104b89060203d6020116103375761032981836106da565b6103fe565b61052860206104cb366107d1565b91936001600160a01b039093169291906104ee5f80808089895af16103af61097b565b5f80516020610a7583398151915260405180610509816109f6565b0390a16040516353266bbb60e01b8152958692839230600485016108a2565b03815f6108005af192831561017e575f80938193829361043597610563575b505f80516020610a7583398151915260405180610421816108e3565b61057b9060203d6020116103375761032981836106da565b610547565b3461009a5761058e36610772565b60405163a9059cbb60e01b81526001600160a01b03858116600483015260248201859052919592949290911691906020816044815f875af1801561017e576102ae966020966105e88893610603955f916106a75750610833565b5f80516020610a75833981519152604051806103d081610877565b03815f6108005af1908161068c575b50610669575f80516020610a75833981519152604051806102748161090d565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810192909252909283919082905f9082906044820190565b5f80516020610a7583398151915260405180610684816108e3565b0390a1610632565b6106a290863d88116103375761032981836106da565b610612565b6106be9150853d87116103375761032981836106da565b8b6101fd565b600435906001600160a01b038216820361009a57565b90601f8019910116810190811067ffffffffffffffff8211176106fc57604052565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff81116106fc57601f01601f191660200190565b81601f8201121561009a5780359061074382610710565b9261075160405194856106da565b8284526020838301011161009a57815f926020809301838601378301015290565b9060a060031983011261009a576004356001600160a01b038116810361009a57916024356001600160a01b038116810361009a5791604435916064359067ffffffffffffffff821161009a576107ca9160040161072c565b9060843590565b608060031982011261009a576004356001600160a01b038116810361009a5791602435916044359067ffffffffffffffff821161009a576108149160040161072c565b9060643590565b9081602091031261009a5751801515810361009a5790565b1561083a57565b60405162461bcd60e51b8152602060048201526015602482015274119a5c9cdd081d1c985b9cd9995c8819985a5b1959605a1b6044820152606490fd5b906040825260096040830152687472616e736665723160b81b60608301526001602060808401930152565b939291602060809160409360018060a01b0316875260608288015280519182918260608a0152018388015e5f828288010152601f8019910116850101930152565b9060408252600860408301526764656c656761746560c01b60608301526001602060808401930152565b9060408252600860408301526764656c656761746560c01b60608301525f602060808401930152565b1561093d57565b60405162461bcd60e51b815260206004820152601660248201527514d958dbdb99081d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b3d156109a5573d9061098c82610710565b9161099a60405193846106da565b82523d5f602084013e565b606090565b156109b157565b60405162461bcd60e51b815260206004820152601c60248201527f4669727374206e6174697665207472616e73666572206661696c6564000000006044820152606490fd5b9060408252601060408301526f6e61746976655f7472616e736665723160801b60608301526001602060808401930152565b15610a2f57565b60405162461bcd60e51b815260206004820152601d60248201527f5365636f6e64206e6174697665207472616e73666572206661696c65640000006044820152606490fdfe9f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a2646970667358221220812e19faad284c98acceefeabafa7a0d7e2b10f1985e905c56f14f95c37a432e64736f6c634300081a0033", + "deployedBytecode": "0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c8063456503c8146105805780635b3d97d5146104bd5780635c3f86c9146103765780636e348ad6146101a45780636f9fb98a14610189578063c489744b146100da578063e1f756c31461009e5763efd8be620361000e573461009a57602036600319011261009a5760206100916106c4565b31604051908152f35b5f80fd5b604036600319011261009a5760205f8080806100b86106c4565b602435906001600160a01b03165af16100cf61097b565b506040519015158152f35b3461009a57604036600319011261009a576100f36106c4565b6024356001600160a01b0381169081900361009a576040516370a0823160e01b8152600481019190915290602090829060249082906001600160a01b03165afa801561017e575f9061014b575b602090604051908152f35b506020813d602011610176575b81610165602093836106da565b8101031261009a5760209051610140565b3d9150610158565b6040513d5f823e3d90fd5b3461009a575f36600319011261009a57602047604051908152f35b3461009a576101b236610772565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820185905290951691906020866044815f875af191821561017e5761020360209361023d985f91610359575b50610833565b5f80516020610a758339815191526040518061021e81610877565b0390a16040516353266bbb60e01b8152968792839230600485016108a2565b03815f6108005af192831561017e576102ae9460209461033e575b505f80516020610a7583398151915260405180610274816108e3565b0390a160405163a9059cbb60e01b81526001600160a01b0390911660048201526024810192909252909283919082905f9082906044820190565b03925af1801561017e576102c9915f9161030f575b50610936565b5f80516020610a758339815191526040518061030a81906040825260096040830152683a3930b739b332b91960b91b60608301526001602060808401930152565b0390a1005b610331915060203d602011610337575b61032981836106da565b81019061081b565b826102c3565b503d61031f565b61035490853d87116103375761032981836106da565b610258565b6103709150853d87116103375761032981836106da565b896101fd565b6104355f80808060206103ef61038b366107d1565b91946001600160a01b03909316939291906103b5878080808a8a5af16103af61097b565b506109aa565b5f80516020610a75833981519152604051806103d0816109f6565b0390a16040516353266bbb60e01b8152938492839230600485016108a2565b0381876108005af190816104a0575b5015831461047d575f80516020610a75833981519152604051806104218161090d565b0390a15b5af161042f61097b565b50610a28565b5f80516020610a758339815191526040518061030a819060408252601060408301526f3730ba34bb32afba3930b739b332b91960811b60608301526001602060808401930152565b5f80516020610a7583398151915260405180610498816108e3565b0390a1610425565b6104b89060203d6020116103375761032981836106da565b6103fe565b61052860206104cb366107d1565b91936001600160a01b039093169291906104ee5f80808089895af16103af61097b565b5f80516020610a7583398151915260405180610509816109f6565b0390a16040516353266bbb60e01b8152958692839230600485016108a2565b03815f6108005af192831561017e575f80938193829361043597610563575b505f80516020610a7583398151915260405180610421816108e3565b61057b9060203d6020116103375761032981836106da565b610547565b3461009a5761058e36610772565b60405163a9059cbb60e01b81526001600160a01b03858116600483015260248201859052919592949290911691906020816044815f875af1801561017e576102ae966020966105e88893610603955f916106a75750610833565b5f80516020610a75833981519152604051806103d081610877565b03815f6108005af1908161068c575b50610669575f80516020610a75833981519152604051806102748161090d565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810192909252909283919082905f9082906044820190565b5f80516020610a7583398151915260405180610684816108e3565b0390a1610632565b6106a290863d88116103375761032981836106da565b610612565b6106be9150853d87116103375761032981836106da565b8b6101fd565b600435906001600160a01b038216820361009a57565b90601f8019910116810190811067ffffffffffffffff8211176106fc57604052565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff81116106fc57601f01601f191660200190565b81601f8201121561009a5780359061074382610710565b9261075160405194856106da565b8284526020838301011161009a57815f926020809301838601378301015290565b9060a060031983011261009a576004356001600160a01b038116810361009a57916024356001600160a01b038116810361009a5791604435916064359067ffffffffffffffff821161009a576107ca9160040161072c565b9060843590565b608060031982011261009a576004356001600160a01b038116810361009a5791602435916044359067ffffffffffffffff821161009a576108149160040161072c565b9060643590565b9081602091031261009a5751801515810361009a5790565b1561083a57565b60405162461bcd60e51b8152602060048201526015602482015274119a5c9cdd081d1c985b9cd9995c8819985a5b1959605a1b6044820152606490fd5b906040825260096040830152687472616e736665723160b81b60608301526001602060808401930152565b939291602060809160409360018060a01b0316875260608288015280519182918260608a0152018388015e5f828288010152601f8019910116850101930152565b9060408252600860408301526764656c656761746560c01b60608301526001602060808401930152565b9060408252600860408301526764656c656761746560c01b60608301525f602060808401930152565b1561093d57565b60405162461bcd60e51b815260206004820152601660248201527514d958dbdb99081d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b3d156109a5573d9061098c82610710565b9161099a60405193846106da565b82523d5f602084013e565b606090565b156109b157565b60405162461bcd60e51b815260206004820152601c60248201527f4669727374206e6174697665207472616e73666572206661696c6564000000006044820152606490fd5b9060408252601060408301526f6e61746976655f7472616e736665723160801b60608301526001602060808401930152565b15610a2f57565b60405162461bcd60e51b815260206004820152601d60248201527f5365636f6e64206e6174697665207472616e73666572206661696c65640000006044820152606490fdfe9f4d25774676d497fe3d8c1e43709b68b186fad01b05798c1410a178ff4ed7d0a2646970667358221220812e19faad284c98acceefeabafa7a0d7e2b10f1985e905c56f14f95c37a432e64736f6c634300081a0033", "linkReferences": {}, "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/solidity/SequentialOperationsTester.sol", - "buildInfoId": "solc-0_8_20-a1f91ec3b065d50730c0367f861277c93634d90c" + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" } \ No newline at end of file diff --git a/contracts/solidity/SequentialOperationsTester.sol b/contracts/solidity/SequentialOperationsTester.sol index c17a58c04..2c70cfe39 100644 --- a/contracts/solidity/SequentialOperationsTester.sol +++ b/contracts/solidity/SequentialOperationsTester.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import "./precompiles/staking/StakingI.sol"; -import "./precompiles/erc20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./precompiles/bech32/Bech32I.sol"; import "./precompiles/common/Types.sol"; diff --git a/contracts/solidity/StaticCallTester.json b/contracts/solidity/StaticCallTester.json index 541a4da77..48018a5e7 100644 --- a/contracts/solidity/StaticCallTester.json +++ b/contracts/solidity/StaticCallTester.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "StaticCallTester", "sourceName": "solidity/StaticCallTester.sol", "abi": [ @@ -165,8 +165,11 @@ "type": "function" } ], - "bytecode": "0x60803461007457601f61041838819003918201601f19168301916001600160401b038311848410176100795780849260209460405283398101031261007457516001600160a01b0381169081900361007457600080546001600160a01b03191691909117905560405161038890816100908239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe604060808152600436101561001357600080fd5b600090813560e01c80631cfa8b101461017d5780634d751fbf146101a95780634ebbe1cf146101a95780635741229c1461018257806361bc221a1461015f578063677d4eca1461017d5780638ada066e1461015f578063dfe9a695146100f55763eae6bdeb1461008257600080fd5b346100f157816003193601126100f1578051634ebbe1cf60e01b6020820190815260048252929080830167ffffffffffffffff8111828210176100dd57835251602093829190305afa906100d4610312565b50519015158152f35b634e487b7160e01b83526041600452602483fd5b5080fd5b50346100f1578160209261015161014361010e366101ae565b86516301cfa8b160e41b8982019081526001600160a01b03909316602482015260448101919091529092909182906064820190565b03601f1981018352826102da565b5190305afa906100d4610312565b50346100f157816003193601126100f1576020906001549051908152f35b6101d9565b50346100f157816003193601126100f157905490516001600160a01b039091168152602090f35b610295565b60409060031901126101d4576004356001600160a01b03811681036101d4579060243590565b600080fd5b346101d457602061022d6101ec366101ae565b6000805460405163a9059cbb60e01b81526001600160a01b039485166004820152602481019390935290949193919284929116908290869082906044820190565b03925af190811561028a57829161024c575b6020826040519015158152f35b90506020813d8211610282575b81610266602093836102da565b810103126100f1575180151581036100f157602091503861023f565b3d9150610259565b6040513d84823e3d90fd5b346101d45760003660031901126101d45760015460001981146102c45760016020910180600155604051908152f35b634e487b7160e01b600052601160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176102fc57604052565b634e487b7160e01b600052604160045260246000fd5b3d1561034d573d9067ffffffffffffffff82116102fc5760405191610341601f8201601f1916602001846102da565b82523d6000602084013e565b60609056fea2646970667358221220e77e9a7f006cac4b937c19161fc0535b14d5ddad274962e4884498f23ba333cc64736f6c63430008140033", - "deployedBytecode": "0x604060808152600436101561001357600080fd5b600090813560e01c80631cfa8b101461017d5780634d751fbf146101a95780634ebbe1cf146101a95780635741229c1461018257806361bc221a1461015f578063677d4eca1461017d5780638ada066e1461015f578063dfe9a695146100f55763eae6bdeb1461008257600080fd5b346100f157816003193601126100f1578051634ebbe1cf60e01b6020820190815260048252929080830167ffffffffffffffff8111828210176100dd57835251602093829190305afa906100d4610312565b50519015158152f35b634e487b7160e01b83526041600452602483fd5b5080fd5b50346100f1578160209261015161014361010e366101ae565b86516301cfa8b160e41b8982019081526001600160a01b03909316602482015260448101919091529092909182906064820190565b03601f1981018352826102da565b5190305afa906100d4610312565b50346100f157816003193601126100f1576020906001549051908152f35b6101d9565b50346100f157816003193601126100f157905490516001600160a01b039091168152602090f35b610295565b60409060031901126101d4576004356001600160a01b03811681036101d4579060243590565b600080fd5b346101d457602061022d6101ec366101ae565b6000805460405163a9059cbb60e01b81526001600160a01b039485166004820152602481019390935290949193919284929116908290869082906044820190565b03925af190811561028a57829161024c575b6020826040519015158152f35b90506020813d8211610282575b81610266602093836102da565b810103126100f1575180151581036100f157602091503861023f565b3d9150610259565b6040513d84823e3d90fd5b346101d45760003660031901126101d45760015460001981146102c45760016020910180600155604051908152f35b634e487b7160e01b600052601160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176102fc57604052565b634e487b7160e01b600052604160045260246000fd5b3d1561034d573d9067ffffffffffffffff82116102fc5760405191610341601f8201601f1916602001846102da565b82523d6000602084013e565b60609056fea2646970667358221220e77e9a7f006cac4b937c19161fc0535b14d5ddad274962e4884498f23ba333cc64736f6c63430008140033", + "bytecode": "0x608034606f57601f6103c438819003918201601f19168301916001600160401b03831184841017607357808492602094604052833981010312606f57516001600160a01b03811690819003606f575f80546001600160a01b03191691909117905560405161033c90816100888239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80631cfa8b10146101455780634d751fbf146101715780634ebbe1cf146101715780635741229c1461014a57806361bc221a14610128578063677d4eca146101455780638ada066e14610128578063dfe9a695146100cc5763eae6bdeb1461007c575f80fd5b346100c8575f3660031901126100c85760205f8060405183810190634ebbe1cf60e01b8252600481526100b0602482610291565b5190305afa6100bd6102c7565b506040519015158152f35b5f80fd5b346100c85760205f806100b061011a6100e436610176565b6040516301cfa8b160e41b8882019081526001600160a01b03909316602482015260448101919091529092909182906064820190565b03601f198101835282610291565b346100c8575f3660031901126100c8576020600154604051908152f35b61019c565b346100c8575f3660031901126100c8575f546040516001600160a01b039091168152602090f35b610250565b60409060031901126100c8576004356001600160a01b03811681036100c8579060243590565b346100c8576101eb60206101af36610176565b5f805460405163a9059cbb60e01b81526001600160a01b0394851660048201526024810193909352919485939092169183919082906044820190565b03925af18015610245575f90610209575b6040519015158152602090f35b506020813d60201161023d575b8161022360209383610291565b810103126100c8575180151581036100c8576020906101fc565b3d9150610216565b6040513d5f823e3d90fd5b346100c8575f3660031901126100c8576001545f19811461027d5760016020910180600155604051908152f35b634e487b7160e01b5f52601160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176102b357604052565b634e487b7160e01b5f52604160045260245ffd5b3d15610301573d9067ffffffffffffffff82116102b357604051916102f6601f8201601f191660200184610291565b82523d5f602084013e565b60609056fea26469706673582212204c12eb54ca422ff86f9e7e4efd542c93d519d3bfd021c676a55f90c681706eea64736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c80631cfa8b10146101455780634d751fbf146101715780634ebbe1cf146101715780635741229c1461014a57806361bc221a14610128578063677d4eca146101455780638ada066e14610128578063dfe9a695146100cc5763eae6bdeb1461007c575f80fd5b346100c8575f3660031901126100c85760205f8060405183810190634ebbe1cf60e01b8252600481526100b0602482610291565b5190305afa6100bd6102c7565b506040519015158152f35b5f80fd5b346100c85760205f806100b061011a6100e436610176565b6040516301cfa8b160e41b8882019081526001600160a01b03909316602482015260448101919091529092909182906064820190565b03601f198101835282610291565b346100c8575f3660031901126100c8576020600154604051908152f35b61019c565b346100c8575f3660031901126100c8575f546040516001600160a01b039091168152602090f35b610250565b60409060031901126100c8576004356001600160a01b03811681036100c8579060243590565b346100c8576101eb60206101af36610176565b5f805460405163a9059cbb60e01b81526001600160a01b0394851660048201526024810193909352919485939092169183919082906044820190565b03925af18015610245575f90610209575b6040519015158152602090f35b506020813d60201161023d575b8161022360209383610291565b810103126100c8575180151581036100c8576020906101fc565b3d9150610216565b6040513d5f823e3d90fd5b346100c8575f3660031901126100c8576001545f19811461027d5760016020910180600155604051908152f35b634e487b7160e01b5f52601160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176102b357604052565b634e487b7160e01b5f52604160045260245ffd5b3d15610301573d9067ffffffffffffffff82116102b357604051916102f6601f8201601f191660200184610291565b82523d5f602084013e565b60609056fea26469706673582212204c12eb54ca422ff86f9e7e4efd542c93d519d3bfd021c676a55f90c681706eea64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/StaticCallTester.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/contracts/solidity/WATOM.json b/contracts/solidity/WATOM.json index 10fef632c..a75e9a5a4 100644 --- a/contracts/solidity/WATOM.json +++ b/contracts/solidity/WATOM.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "WATOM", "sourceName": "solidity/WATOM.sol", "abi": [ @@ -173,8 +173,11 @@ "type": "receive" } ], - "bytecode": "0x6080604052346100cb57600061001581546100d0565b601f81116100a1575b5060186b577261707065642041746f6d60a01b01815560019061004182546100d0565b90601f8211610075575b600a645741544f4d60d81b0183556002805460ff191660121790556040516105c1908161010b8239f35b82815282601f60208320930160051c8301925b83811061009657505061004b565b828155018390610088565b818052601f60208320910160051c8101905b8181106100c0575061001e565b8281556001016100b3565b600080fd5b90600182811c92168015610100575b60208310146100ea57565b634e487b7160e01b600052602260045260246000fd5b91607f16916100df56fe60806040908082526004918236101561002b575b505050361561002157600080fd5b6100296104f2565b005b600092833560e01c92836306fdde0314610399575082632e1a7d4d14610287578263313ce5671461026557826370a082311461022d57826395d89b411461014857508163a9059cbb146100a3575063d0e30db01461008a578080610013565b806003193601126100a05761009d6104f2565b80f35b80fd5b9050346101445780600319360112610144576020916100c06104b4565b8260243591338452600386526100db8383862054101561053b565b338452600386528184206100f084825461057e565b90556001600160a01b031680845260038652922080546101119083906104cf565b905582519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843392a35160018152f35b5080fd5b91503461022957826003193601126102295780519183600180549182821c92828116801561021f575b602095868610821461020c57508488529081156101ea57506001146101b0575b6101ac86866101a2828b0383610433565b519182918261046b565b0390f35b9295508083528583205b8284106101d757505050826101ac946101a2928201019438610191565b80548685018801529286019281016101ba565b60ff191687860152505050151560051b83010192506101a2826101ac38610191565b634e487b7160e01b845260229052602483fd5b93607f1693610171565b8280fd5b8382346101445760203660031901126101445760209181906001600160a01b036102556104b4565b1681526003845220549051908152f35b83823461014457816003193601126101445760209060ff600254169051908152f35b915034610229576020908160031936011261039557823592338552600383526102b58483872054101561053b565b338552600383528185206102ca85825461057e565b90558480808087335af13d15610390573d67ffffffffffffffff811161037d57835190610300601f8201601f1916870183610433565b815286853d92013e5b1561033c5750907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6591519283523392a280f35b82606492519162461bcd60e51b8352820152601c60248201527f6661696c656420746f20776974686472617720746f2073656e646572000000006044820152fd5b634e487b7160e01b875260418352602487fd5b610309565b8380fd5b9250346103955783600319360112610395578354600181811c9186908281168015610429575b602095868610821461020c57508488529081156101ea57506001146103ef576101ac86866101a2828b0383610433565b8080949750528583205b82841061041657505050826101ac946101a2928201019438610191565b80548685018801529286019281016103f9565b93607f16936103bf565b90601f8019910116810190811067ffffffffffffffff82111761045557604052565b634e487b7160e01b600052604160045260246000fd5b6020808252825181830181905290939260005b8281106104a057505060409293506000838284010152601f8019910116010190565b81810186015184820160400152850161047e565b600435906001600160a01b03821682036104ca57565b600080fd5b919082018092116104dc57565b634e487b7160e01b600052601160045260246000fd5b336000526003602052604060002061050b3482546104cf565b90556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a2565b1561054257565b60405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606490fd5b919082039182116104dc5756fea26469706673582212201392bc3199ab613bc84b097477ac2e199bb1c5bc21a129f158f3f057cb757d7064736f6c63430008140033", - "deployedBytecode": "0x60806040908082526004918236101561002b575b505050361561002157600080fd5b6100296104f2565b005b600092833560e01c92836306fdde0314610399575082632e1a7d4d14610287578263313ce5671461026557826370a082311461022d57826395d89b411461014857508163a9059cbb146100a3575063d0e30db01461008a578080610013565b806003193601126100a05761009d6104f2565b80f35b80fd5b9050346101445780600319360112610144576020916100c06104b4565b8260243591338452600386526100db8383862054101561053b565b338452600386528184206100f084825461057e565b90556001600160a01b031680845260038652922080546101119083906104cf565b905582519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843392a35160018152f35b5080fd5b91503461022957826003193601126102295780519183600180549182821c92828116801561021f575b602095868610821461020c57508488529081156101ea57506001146101b0575b6101ac86866101a2828b0383610433565b519182918261046b565b0390f35b9295508083528583205b8284106101d757505050826101ac946101a2928201019438610191565b80548685018801529286019281016101ba565b60ff191687860152505050151560051b83010192506101a2826101ac38610191565b634e487b7160e01b845260229052602483fd5b93607f1693610171565b8280fd5b8382346101445760203660031901126101445760209181906001600160a01b036102556104b4565b1681526003845220549051908152f35b83823461014457816003193601126101445760209060ff600254169051908152f35b915034610229576020908160031936011261039557823592338552600383526102b58483872054101561053b565b338552600383528185206102ca85825461057e565b90558480808087335af13d15610390573d67ffffffffffffffff811161037d57835190610300601f8201601f1916870183610433565b815286853d92013e5b1561033c5750907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6591519283523392a280f35b82606492519162461bcd60e51b8352820152601c60248201527f6661696c656420746f20776974686472617720746f2073656e646572000000006044820152fd5b634e487b7160e01b875260418352602487fd5b610309565b8380fd5b9250346103955783600319360112610395578354600181811c9186908281168015610429575b602095868610821461020c57508488529081156101ea57506001146103ef576101ac86866101a2828b0383610433565b8080949750528583205b82841061041657505050826101ac946101a2928201019438610191565b80548685018801529286019281016103f9565b93607f16936103bf565b90601f8019910116810190811067ffffffffffffffff82111761045557604052565b634e487b7160e01b600052604160045260246000fd5b6020808252825181830181905290939260005b8281106104a057505060409293506000838284010152601f8019910116010190565b81810186015184820160400152850161047e565b600435906001600160a01b03821682036104ca57565b600080fd5b919082018092116104dc57565b634e487b7160e01b600052601160045260246000fd5b336000526003602052604060002061050b3482546104cf565b90556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a2565b1561054257565b60405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606490fd5b919082039182116104dc5756fea26469706673582212201392bc3199ab613bc84b097477ac2e199bb1c5bc21a129f158f3f057cb757d7064736f6c63430008140033", + "bytecode": "0x60806040523461010f576100135f54610113565b601f81116100c8575b507f577261707065642041746f6d00000000000000000000000000000000000000185f5560015461004c90610113565b601f8111610080575b600a645741544f4d60d81b016001556002805460ff191660121790556040516105ab908161014c8239f35b60015f52601f0160051c7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6908101905b8181106100bd5750610055565b5f81556001016100b0565b5f8052601f0160051c7f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563908101905b818110610104575061001c565b5f81556001016100f7565b5f80fd5b90600182811c92168015610141575b602083101461012d57565b634e487b7160e01b5f52602260045260245ffd5b91607f169161012256fe60806040526004361015610022575b3615610018575f80fd5b61002061052e565b005b5f3560e01c806306fdde03146103a35780632e1a7d4d1461028d578063313ce5671461026d57806370a082311461023557806395d89b4114610131578063a9059cbb1461008a5763d0e30db00361000e575f3660031901126100865761002061052e565b5f80fd5b34610086576040366003190112610086576100a36104a7565b60243590335f5260036020526100bf8260405f205410156104bd565b335f52600360205260405f206100d6838254610500565b905560018060a01b031690815f52600360205260405f206100f8828254610521565b90556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203392a3602060405160018152f35b34610086575f366003190112610086576040515f6001548060011c9060018116801561022b575b602083108114610217578285529081156101f35750600114610195575b610191836101858185038261045b565b6040519182918261047d565b0390f35b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b8082106101d957509091508101602001610185610175565b9192600181602092548385880101520191019092916101c1565b60ff191660208086019190915291151560051b840190910191506101859050610175565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610158565b34610086576020366003190112610086576001600160a01b036102566104a7565b165f526003602052602060405f2054604051908152f35b34610086575f36600319011261008657602060ff60025416604051908152f35b3461008657602036600319011261008657600435335f5260036020526102b98160405f205410156104bd565b335f52600360205260405f206102d0828254610500565b90555f80808084335af13d1561039e573d67ffffffffffffffff811161038a5760405190610308601f8201601f19166020018361045b565b81525f60203d92013e5b15610345576040519081527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6560203392a2005b60405162461bcd60e51b815260206004820152601c60248201527f6661696c656420746f20776974686472617720746f2073656e646572000000006044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b610312565b34610086575f366003190112610086576040515f80548060011c90600181168015610451575b602083108114610217578285529081156101f357506001146103f557610191836101858185038261045b565b5f8080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563939250905b80821061043757509091508101602001610185610175565b91926001816020925483858801015201910190929161041f565b91607f16916103c9565b90601f8019910116810190811067ffffffffffffffff82111761038a57604052565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361008657565b156104c457565b60405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606490fd5b9190820391821161050d57565b634e487b7160e01b5f52601160045260245ffd5b9190820180921161050d57565b335f52600360205260405f20610545348254610521565b90556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a256fea2646970667358221220f89c15ff2ae4dbae93cd89466a3bc8026ef2d9058677b7cb92cafdd32070637764736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610022575b3615610018575f80fd5b61002061052e565b005b5f3560e01c806306fdde03146103a35780632e1a7d4d1461028d578063313ce5671461026d57806370a082311461023557806395d89b4114610131578063a9059cbb1461008a5763d0e30db00361000e575f3660031901126100865761002061052e565b5f80fd5b34610086576040366003190112610086576100a36104a7565b60243590335f5260036020526100bf8260405f205410156104bd565b335f52600360205260405f206100d6838254610500565b905560018060a01b031690815f52600360205260405f206100f8828254610521565b90556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203392a3602060405160018152f35b34610086575f366003190112610086576040515f6001548060011c9060018116801561022b575b602083108114610217578285529081156101f35750600114610195575b610191836101858185038261045b565b6040519182918261047d565b0390f35b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b8082106101d957509091508101602001610185610175565b9192600181602092548385880101520191019092916101c1565b60ff191660208086019190915291151560051b840190910191506101859050610175565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610158565b34610086576020366003190112610086576001600160a01b036102566104a7565b165f526003602052602060405f2054604051908152f35b34610086575f36600319011261008657602060ff60025416604051908152f35b3461008657602036600319011261008657600435335f5260036020526102b98160405f205410156104bd565b335f52600360205260405f206102d0828254610500565b90555f80808084335af13d1561039e573d67ffffffffffffffff811161038a5760405190610308601f8201601f19166020018361045b565b81525f60203d92013e5b15610345576040519081527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6560203392a2005b60405162461bcd60e51b815260206004820152601c60248201527f6661696c656420746f20776974686472617720746f2073656e646572000000006044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b610312565b34610086575f366003190112610086576040515f80548060011c90600181168015610451575b602083108114610217578285529081156101f357506001146103f557610191836101858185038261045b565b5f8080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563939250905b80821061043757509091508101602001610185610175565b91926001816020925483858801015201910190929161041f565b91607f16916103c9565b90601f8019910116810190811067ffffffffffffffff82111761038a57604052565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361008657565b156104c457565b60405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606490fd5b9190820391821161050d57565b634e487b7160e01b5f52601160045260245ffd5b9190820180921161050d57565b335f52600360205260405f20610545348254610521565b90556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a256fea2646970667358221220f89c15ff2ae4dbae93cd89466a3bc8026ef2d9058677b7cb92cafdd32070637764736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/WATOM.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/contracts/solidity/precompiles/bank/IBank.sol b/contracts/solidity/precompiles/bank/IBank.sol index 7c85d7279..0e0c245bd 100644 --- a/contracts/solidity/precompiles/bank/IBank.sol +++ b/contracts/solidity/precompiles/bank/IBank.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.18; +import "../common/Types.sol"; + /// @dev The IBank contract's address. address constant IBANK_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000804; @@ -20,7 +22,7 @@ struct Balance { * @title Bank Interface * @dev Interface for querying balances and supply from the Bank module. */ -interface IBank { +interface IBank is IPrecompile { /// @dev balances defines a method for retrieving all the native token balances /// for a given account. /// @param account the address of the account to query balances for. diff --git a/contracts/solidity/precompiles/bech32/Bech32I.sol b/contracts/solidity/precompiles/bech32/Bech32I.sol index 7d1c65a15..faaa26190 100644 --- a/contracts/solidity/precompiles/bech32/Bech32I.sol +++ b/contracts/solidity/precompiles/bech32/Bech32I.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.17; +import "../common/Types.sol"; + /// @dev The Bech32I contract's address. address constant Bech32_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000400; @@ -12,7 +14,7 @@ Bech32I constant BECH32_CONTRACT = Bech32I(Bech32_PRECOMPILE_ADDRESS); /// @dev The interface through which solidity contracts can convert addresses from /// hex to bech32 and vice versa. /// @custom:address 0x0000000000000000000000000000000000000400 -interface Bech32I { +interface Bech32I is IPrecompile { /// @dev Defines a method for converting a hex formatted address to bech32. /// @param addr The hex address to be converted. /// @param prefix The human readable prefix (HRP) of the bech32 address. diff --git a/contracts/solidity/precompiles/common/Types.sol b/contracts/solidity/precompiles/common/Types.sol index deeb78d03..1461491d1 100644 --- a/contracts/solidity/precompiles/common/Types.sol +++ b/contracts/solidity/precompiles/common/Types.sol @@ -62,3 +62,18 @@ struct Height { // the height within the given revision uint64 revisionHeight; } + +interface IPrecompile { + error RequesterIsNotMsgSender(address msgSender, address requester); + error InvalidAddress(string bad); + error InvalidAmount(string amount); + error InvalidHeight(string height); + error InvalidPubkey(string pubkey); + error InvalidPubkeySize(uint256 got, uint256 expected); + error ABISetupFailed(string reason); + error InvalidNumberOfArgs(uint256 expected, uint256 got); + error UnknownMethod(string methodName); + error QueryFailed(string queryMethod, string reason); + error MsgServerFailed(string msgMethod, string reason); + error EventEmitFailed(string eventKind, string reason); +} diff --git a/contracts/solidity/precompiles/distribution/DistributionI.sol b/contracts/solidity/precompiles/distribution/DistributionI.sol index cd98b6323..877df0f44 100644 --- a/contracts/solidity/precompiles/distribution/DistributionI.sol +++ b/contracts/solidity/precompiles/distribution/DistributionI.sol @@ -36,7 +36,11 @@ struct DelegationDelegatorReward { /// @title Distribution Precompile Contract /// @dev The interface through which solidity contracts will interact with Distribution /// @custom:address 0x0000000000000000000000000000000000000801 -interface DistributionI { +interface DistributionI is IPrecompile { + error DistributionInputInvalid(string callMethod, string reason); + error DistributionValidatorSlashesUnpackFailed(string reason); + error ClaimRewardsMaxRetrieveExceeded(uint32 maxRetrieve, uint32 maxValidators); + /// @dev ClaimRewards defines an Event emitted when rewards are claimed /// @param delegatorAddress the address of the delegator /// @param amount the amount being claimed diff --git a/contracts/solidity/precompiles/erc20/ERC20I.sol b/contracts/solidity/precompiles/erc20/ERC20I.sol new file mode 100644 index 000000000..a91f34ebc --- /dev/null +++ b/contracts/solidity/precompiles/erc20/ERC20I.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; + +import "../common/Types.sol"; + +/// @dev Cosmos ERC-20 precompile: OpenZeppelin IERC20 (via IERC20Metadata) and metadata, +/// ERC-6093 IERC20Errors, shared IPrecompile errors, and native-value rejection. +interface ERC20I is IERC20Metadata, IERC20Errors, IPrecompile { + error ERC20CannotReceiveFunds(uint256 value); +} diff --git a/contracts/solidity/precompiles/erc20/IERC20.sol b/contracts/solidity/precompiles/erc20/IERC20.sol deleted file mode 100644 index 66c4e4d88..000000000 --- a/contracts/solidity/precompiles/erc20/IERC20.sol +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); - - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `to`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address to, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `from` to `to` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address from, address to, uint256 amount) external returns (bool); -} diff --git a/contracts/solidity/precompiles/erc20/IERC20Metadata.sol b/contracts/solidity/precompiles/erc20/IERC20Metadata.sol deleted file mode 100644 index 982bc39eb..000000000 --- a/contracts/solidity/precompiles/erc20/IERC20Metadata.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) - -pragma solidity ^0.8.0; - -import "./IERC20.sol"; - -/** - * @dev Interface for the optional metadata functions from the ERC20 standard. - * - * _Available since v4.1._ - */ -interface IERC20Metadata is IERC20 { - /** - * @dev Returns the name of the token. - */ - function name() external view returns (string memory); - - /** - * @dev Returns the symbol of the token. - */ - function symbol() external view returns (string memory); - - /** - * @dev Returns the decimals places of the token. - */ - function decimals() external view returns (uint8); -} diff --git a/contracts/solidity/precompiles/erc20/testdata/ERC20TestCaller.sol b/contracts/solidity/precompiles/erc20/testdata/ERC20TestCaller.sol index add1b0b25..8db366ab7 100644 --- a/contracts/solidity/precompiles/erc20/testdata/ERC20TestCaller.sol +++ b/contracts/solidity/precompiles/erc20/testdata/ERC20TestCaller.sol @@ -1,17 +1,17 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity >=0.8.17; +pragma solidity ^0.8.20; -import "../IERC20Metadata.sol" as erc20Precompile; +import "../ERC20I.sol" as erc20Precompile; /// @title ERC20TestCaller /// @author Erric -/// @dev This contract is used to test external contract calls to the ERC20 precompile. +/// @dev This contract is used to test external contract calls to the ERC20I precompile. contract ERC20TestCaller { - erc20Precompile.IERC20Metadata public token; + erc20Precompile.ERC20I public token; uint256 public counter; constructor(address tokenAddress) { - token = erc20Precompile.IERC20Metadata(tokenAddress); + token = erc20Precompile.ERC20I(tokenAddress); counter = 0; } @@ -122,4 +122,4 @@ contract ERC20TestCaller { {} catch {} counter++; } -} +} \ No newline at end of file diff --git a/contracts/solidity/precompiles/gov/IGov.sol b/contracts/solidity/precompiles/gov/IGov.sol index 7fa92a8ea..5497d28e3 100644 --- a/contracts/solidity/precompiles/gov/IGov.sol +++ b/contracts/solidity/precompiles/gov/IGov.sol @@ -93,7 +93,26 @@ struct Params { /// @author The Evmos Core Team /// @title Gov Precompile Contract /// @dev The interface through which solidity contracts will interact with Gov -interface IGov { +interface IGov is IPrecompile { + /// @notice Argument or payload validation that does not map to a common IPrecompile error. + error GovInputInvalid(string callMethod, string reason); + /// @notice Invalid JSON proposal payload (protoJSON envelope). + error InvalidProposalJSON(string callMethod, string reason); + /// @notice Invalid Vote option argument. + error InvalidOption(string callMethod, string reason); + /// @notice Invalid metadata argument. + error InvalidMetadata(string callMethod, string reason); + /// @notice Failed to unpack votes query input. + error VotesInputUnpackFailed(string reason); + /// @notice Failed to unpack deposits query input. + error DepositsInputUnpackFailed(string reason); + /// @notice Failed to unpack proposals query input. + error ProposalsInputUnpackFailed(string reason); + /// @notice Failed to unpack voteWeighted options input. + error WeightedVoteOptionsUnpackFailed(string reason); + /// @notice Invalid proposal ID argument. + error InvalidProposalID(string reason); + /// @dev SubmitProposal defines an Event emitted when a proposal is submitted. /// @param proposer the address of the proposer /// @param proposalId the proposal of id diff --git a/contracts/solidity/precompiles/ics02/ICS02I.sol b/contracts/solidity/precompiles/ics02/ICS02I.sol new file mode 100644 index 000000000..fe2a77265 --- /dev/null +++ b/contracts/solidity/precompiles/ics02/ICS02I.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity >=0.8.18; + +import "../common/Types.sol"; + +/// @dev The ICS02I contract's address. +address constant ICS02_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000807; + +/// @dev The ICS02 contract's instance. +ICS02I constant ICS02_CONTRACT = ICS02I(ICS02_PRECOMPILE_ADDRESS); + +/// @author CosmosLabs +/// @title ICS02 Client Router Precompile Interface +/// @dev The interface through which solidity contracts will interact with IBC Light Clients (ICS02) +/// @custom:address 0x0000000000000000000000000000000000000807 +interface ICS02I is IPrecompile { + /// @notice Invalid IBC client identifier (format/encoding). + error InvalidClientID(string clientId); + /// @notice Invalid membership proof bytes. + error InvalidProof(bytes proof); + /// @notice Invalid merkle path argument. + error InvalidPath(bytes[] path); + /// @notice Invalid value bytes argument. + error InvalidValue(bytes value); + + /// @notice The result of an update operation + enum UpdateResult { + /// The update was successful + Update, + /// A misbehaviour was detected + Misbehaviour + } + + /// @notice Updates the client with the given client identifier. + /// @param clientId The client identifier + /// @param updateMsg The encoded update message e.g., a protobuf any. + /// @return The result of the update operation + function updateClient(string calldata clientId, bytes calldata updateMsg) external returns (UpdateResult); + + /// @notice Querying the membership of a key-value pair + /// @dev Notice that this message is not view, as it may update the client state for caching purposes. + /// @param proof The proof of membership + /// @param proofHeight The height of the proof + /// @param path The path of the value in the Merkle tree + /// @param value The value in the Merkle tree + /// @return The unix timestamp of the verification height in the counterparty chain in seconds. + function verifyMembership( + string calldata clientId, + bytes calldata proof, + Height calldata proofHeight, + bytes[] calldata path, + bytes calldata value + ) external returns (uint256); + + /// @notice Querying the non-membership of a key + /// @dev Notice that this message is not view, as it may update the client state for caching purposes. + /// @param proof The proof of membership + /// @param proofHeight The height of the proof + /// @param path The path of the value in the Merkle tree + /// @return The unix timestamp of the verification height in the counterparty chain in seconds. + function verifyNonMembership( + string calldata clientId, + bytes calldata proof, + Height calldata proofHeight, + bytes[] calldata path + ) external returns (uint256); + + /// @notice Returns the client state. + /// @param clientId The client identifier + /// @return The client state. + function getClientState(string calldata clientId) external view returns (bytes memory); +} diff --git a/contracts/solidity/precompiles/ics20/ICS20I.sol b/contracts/solidity/precompiles/ics20/ICS20I.sol index 89f3dbbc7..5c4708a68 100644 --- a/contracts/solidity/precompiles/ics20/ICS20I.sol +++ b/contracts/solidity/precompiles/ics20/ICS20I.sol @@ -29,7 +29,22 @@ struct Hop { /// @title ICS20 Transfer Precompiled Contract /// @dev The interface through which solidity contracts will interact with IBC Transfer (ICS20) /// @custom:address 0x0000000000000000000000000000000000000802 -interface ICS20I { +interface ICS20I is IPrecompile { + /// @notice Invalid ICS-20 source port argument. + error InvalidSourcePort(string callMethod, string reason); + /// @notice Invalid ICS-20 source channel (channel ID / client ID) argument. + error InvalidSourceChannel(string callMethod, string reason); + /// @notice Invalid ICS-20 receiver argument. + error InvalidReceiver(string callMethod, string reason); + /// @notice Invalid ICS-20 timeout timestamp argument. + error InvalidTimeoutTimestamp(string callMethod, string reason); + /// @notice Invalid ICS-20 memo argument. + error InvalidMemo(string callMethod, string reason); + /// @notice Invalid denom hash argument. + error InvalidHash(string callMethod, string reason); + /// @notice Invalid denom trace argument. + error InvalidTrace(string callMethod, string reason); + /// @dev Emitted when an ICS-20 transfer is executed. /// @param sender The address of the sender. /// @param receiver The address of the receiver. diff --git a/contracts/solidity/precompiles/slashing/ISlashing.sol b/contracts/solidity/precompiles/slashing/ISlashing.sol index 4e177b80e..36d63a0be 100644 --- a/contracts/solidity/precompiles/slashing/ISlashing.sol +++ b/contracts/solidity/precompiles/slashing/ISlashing.sol @@ -46,7 +46,7 @@ struct Params { /// We follow this same interface including four-byte function selectors, in the precompile that /// wraps the pallet. /// @custom:address 0x0000000000000000000000000000000000000806 -interface ISlashing { +interface ISlashing is IPrecompile { /// @dev Emitted when a validator is unjailed /// @param validator The address of the validator event ValidatorUnjailed(address indexed validator); diff --git a/contracts/solidity/precompiles/staking/StakingI.sol b/contracts/solidity/precompiles/staking/StakingI.sol index 3c55d0d9f..285b5b299 100644 --- a/contracts/solidity/precompiles/staking/StakingI.sol +++ b/contracts/solidity/precompiles/staking/StakingI.sol @@ -2,7 +2,6 @@ pragma solidity >=0.8.17; import "../common/Types.sol"; - /// @dev The StakingI contract's address. address constant STAKING_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000800; @@ -129,7 +128,15 @@ enum BondStatus { /// We follow this same interface including four-byte function selectors, in the precompile that /// wraps the pallet. /// @custom:address 0x0000000000000000000000000000000000000800 -interface StakingI { +interface StakingI is IPrecompile { + /// @notice Precompile-defined errors (ABI-encoded revert data for clients). + error BondDenomQueryFailed(string reason); + error CannotCallFromContract(address msgSender, uint256 codeLength, bool delegated); + error InvalidDescription(string value); + error InvalidCommission(string value); + error RedelegationsInputUnpackFailed(string reason); + error InvalidRedelegationsQuery(string reason); + /// @dev Defines a method for creating a new validator. /// @param description The initial description /// @param commissionRates The initial commissionRates diff --git a/contracts/solidity/precompiles/werc20/IWERC20.sol b/contracts/solidity/precompiles/werc20/IWERC20.sol index b369abe00..827462192 100644 --- a/contracts/solidity/precompiles/werc20/IWERC20.sol +++ b/contracts/solidity/precompiles/werc20/IWERC20.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity >=0.8.18; +pragma solidity >=0.8.20; -import "./../erc20/IERC20Metadata.sol"; +import "../erc20/ERC20I.sol"; /** * @author Evmos Team * @title Wrapped ERC20 Interface * @dev Interface for representing the native EVM token as a wrapped ERC20 standard. */ -interface IWERC20 is IERC20Metadata { +interface IWERC20 is ERC20I { /// @dev Emitted when the native tokens are deposited in exchange for the wrapped ERC20. /// @param dst The account for which the deposit is made. /// @param wad The amount of native tokens deposited. diff --git a/contracts/solidity/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.sol b/contracts/solidity/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.sol index 77053a1d0..72b562209 100644 --- a/contracts/solidity/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.sol +++ b/contracts/solidity/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.sol @@ -3,13 +3,12 @@ pragma solidity ^0.8.0; import "@account-abstraction/contracts/interfaces/IAccount.sol"; -import "@account-abstraction/contracts/core/EntryPoint.sol"; contract SimpleSmartWallet is IAccount { address public owner; - EntryPoint public entryPoint; + address public entryPoint; - function initialize(address _owner, EntryPoint _entryPoint) external { + function initialize(address _owner, address _entryPoint) external { require(owner == address(0), "already initialized"); owner = _owner; entryPoint = _entryPoint; @@ -20,7 +19,7 @@ contract SimpleSmartWallet is IAccount { bytes32 userOpHash, uint256 /* missingAccountFunds */ ) external view override returns (uint256 validationData) { - require(msg.sender == address(entryPoint), "only EntryPoint"); + require(msg.sender == entryPoint, "only EntryPoint"); (uint8 v, bytes32 r, bytes32 s) = _split(userOp.signature); address recovered = ecrecover(userOpHash, v, r, s); @@ -30,7 +29,7 @@ contract SimpleSmartWallet is IAccount { } function execute(address target, uint256 value, bytes calldata data) external { - require(msg.sender == address(entryPoint), "only EntryPoint"); + require(msg.sender == entryPoint, "only EntryPoint"); (bool success, ) = target.call{value: value}(data); require(success, "Execution failed"); } diff --git a/contracts/solidity/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol b/contracts/solidity/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol index ae02b90d1..06c549652 100644 --- a/contracts/solidity/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol +++ b/contracts/solidity/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol @@ -1,18 +1,39 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.20; -import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol"; // This is an evil token. Whenever an A -> B transfer is called, half of the amount goes to B // and half to a predefined C -contract ERC20DirectBalanceManipulation is ERC20PresetMinterPauser { +contract ERC20DirectBalanceManipulation is ERC20, ERC20Burnable, ERC20Pausable, AccessControl { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + address private _thief = 0x4dC6ac40Af078661fc43823086E1513635Eeab14; - constructor(uint256 initialSupply) - ERC20PresetMinterPauser("ERC20DirectBalanceManipulation", "ERC20DirectBalanceManipulation") { - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - _mint(msg.sender, initialSupply); + + constructor(uint256 initialSupply) ERC20("ERC20DirectBalanceManipulation", "ERC20DirectBalanceManipulation") { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + _grantRole(MINTER_ROLE, msg.sender); + _grantRole(PAUSER_ROLE, msg.sender); + _mint(msg.sender, initialSupply); + } + + function pause() public onlyRole(PAUSER_ROLE) { + _pause(); + } + + function unpause() public onlyRole(PAUSER_ROLE) { + _unpause(); } + + function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) { + _mint(to, amount); + } + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { // Any time a transaction happens, the thief account siphons half. uint256 half = amount / 2; @@ -20,4 +41,8 @@ contract ERC20DirectBalanceManipulation is ERC20PresetMinterPauser { super.transfer(_thief, amount - half); // a - h for rounding return super.transfer(recipient, half); } + + function _update(address from, address to, uint256 value) internal override(ERC20, ERC20Pausable) { + super._update(from, to, value); + } } diff --git a/contracts/solidity/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol b/contracts/solidity/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol index 68aff6651..d9b36219d 100644 --- a/contracts/solidity/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol +++ b/contracts/solidity/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol @@ -1,24 +1,48 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.20; -import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol"; // This is an evil token. Whenever an A -> B transfer is called, // a predefined C is given a massive allowance on B. -contract ERC20MaliciousDelayed is ERC20PresetMinterPauser { +contract ERC20MaliciousDelayed is ERC20, ERC20Burnable, ERC20Pausable, AccessControl { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + address private _thief = 0x4dC6ac40Af078661fc43823086E1513635Eeab14; uint256 private _bigNum = 1000000000000000000; // ~uint256(0) - constructor(uint256 initialSupply) - ERC20PresetMinterPauser("ERC20MaliciousDelayed", "ERC20MALICIOUSDELAYED") { - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - _mint(msg.sender, initialSupply); + constructor(uint256 initialSupply) ERC20("ERC20MaliciousDelayed", "ERC20MALICIOUSDELAYED") { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + _grantRole(MINTER_ROLE, msg.sender); + _grantRole(PAUSER_ROLE, msg.sender); + _mint(msg.sender, initialSupply); + } + + function pause() public onlyRole(PAUSER_ROLE) { + _pause(); + } + + function unpause() public onlyRole(PAUSER_ROLE) { + _unpause(); } + + function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) { + _mint(to, amount); + } + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { // Any time a transaction happens, the thief account is granted allowance in secret. // Still emits an Approve! - super._approve(recipient, _thief, _bigNum); + _approve(recipient, _thief, _bigNum); return super.transfer(recipient, amount); } + + function _update(address from, address to, uint256 value) internal override(ERC20, ERC20Pausable) { + super._update(from, to, value); + } } diff --git a/contracts/solidity/x/ibc/callbacks/testutil/CounterWithCallbacks.sol b/contracts/solidity/x/ibc/callbacks/testutil/CounterWithCallbacks.sol index ee9e5d487..ce46d056b 100644 --- a/contracts/solidity/x/ibc/callbacks/testutil/CounterWithCallbacks.sol +++ b/contracts/solidity/x/ibc/callbacks/testutil/CounterWithCallbacks.sol @@ -1,7 +1,7 @@ pragma solidity ^0.8.20; import "../../../../precompiles/callbacks/ICallbacks.sol"; -import "../../../../precompiles/erc20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract CounterWithCallbacks is ICallbacks { // State variables diff --git a/eips/testdata/Counter.json b/eips/testdata/Counter.json index 9b9607864..5e5b9c8ec 100644 --- a/eips/testdata/Counter.json +++ b/eips/testdata/Counter.json @@ -1,7 +1,7 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "Counter", - "sourceName": "solidity/evmd/eips/testdata/Counter.sol", + "sourceName": "solidity/eips/testdata/Counter.sol", "abi": [ { "inputs": [], @@ -31,8 +31,11 @@ "type": "function" } ], - "bytecode": "0x6080806040523461001a57600160005560e190816100208239f35b600080fdfe60806040526004361015601157600080fd5b6000803560e01c80632baeceb714608c57806361bc221a1460715763d09de08a14603a57600080fd5b34606e5780600319360112606e5780546000198114605a57600101815580f35b634e487b7160e01b82526011600452602482fd5b80fd5b5034606e5780600319360112606e5760209054604051908152f35b5034606e5780600319360112606e5780548015605a5760001901815580f3fea26469706673582212202060735f33efd8beff8de6826d5bb836375daa8720f3aab6ae7d0e6280ecf05964736f6c63430008140033", - "deployedBytecode": "0x60806040526004361015601157600080fd5b6000803560e01c80632baeceb714608c57806361bc221a1460715763d09de08a14603a57600080fd5b34606e5780600319360112606e5780546000198114605a57600101815580f35b634e487b7160e01b82526011600452602482fd5b80fd5b5034606e5780600319360112606e5760209054604051908152f35b5034606e5780600319360112606e5780548015605a5760001901815580f3fea26469706673582212202060735f33efd8beff8de6826d5bb836375daa8720f3aab6ae7d0e6280ecf05964736f6c63430008140033", + "bytecode": "0x6080806040523460175760015f5560d89081601c8239f35b5f80fdfe608060405260043610156010575f80fd5b5f3560e01c80632baeceb714608657806361bc221a14606c5763d09de08a146036575f80fd5b346068575f3660031901126068575f545f1981146054576001015f55005b634e487b7160e01b5f52601160045260245ffd5b5f80fd5b346068575f36600319011260685760205f54604051908152f35b346068575f3660031901126068575f5480156054575f19015f5500fea2646970667358221220dddad0a8810a89d275a619dd1bf3eba00a164e71ae2c0c6ff097120d155bfa7a64736f6c634300081a0033", + "deployedBytecode": "0x608060405260043610156010575f80fd5b5f3560e01c80632baeceb714608657806361bc221a14606c5763d09de08a146036575f80fd5b346068575f3660031901126068575f545f1981146054576001015f55005b634e487b7160e01b5f52601160045260245ffd5b5f80fd5b346068575f36600319011260685760205f54604051908152f35b346068575f3660031901126068575f5480156054575f19015f5500fea2646970667358221220dddad0a8810a89d275a619dd1bf3eba00a164e71ae2c0c6ff097120d155bfa7a64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/eips/testdata/Counter.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/eips/testdata/CounterFactory.json b/eips/testdata/CounterFactory.json index 2e0b0ca31..b71f57a95 100644 --- a/eips/testdata/CounterFactory.json +++ b/eips/testdata/CounterFactory.json @@ -1,7 +1,7 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "Counterfactory", - "sourceName": "solidity/evmd/eips/testdata/CounterFactory.sol", + "sourceName": "solidity/eips/testdata/CounterFactory.sol", "abi": [ { "inputs": [], @@ -49,8 +49,11 @@ "type": "function" } ], - "bytecode": "0x60808060405234610085576101018181016001600160401b0381118382101761006f5782916102cf833903906000f0801561006357600080546001600160a01b0319166001600160a01b0392909216919091179055604051610244908161008b8239f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040818152600436101561001457600080fd5b600091823560e01c9081635b34b966146101a55750806372142b89146100e7578063aef38e72146100bc5763f5c5ad831461004e57600080fd5b8190346100b957816003193601126100b95781546001600160a01b031690813b156100b5578280926004835180958193632baeceb760e01b83525af19081156100ac57506100995750f35b6100a2906101fa565b6100a95780f35b80fd5b513d84823e3d90fd5b5050fd5b50fd5b50346100e357816003193601126100e357905490516001600160a01b039091168152602090f35b5080fd5b50346100e357816003193601126100e357815481516330de110d60e11b81529190602090839060049082906001600160a01b03165afa91821561019b578392610135575b6020838351908152f35b90915060203d8111610194575b601f8101601f1916820167ffffffffffffffff81118382101761017e57602091839185528101031261017a576020925051903861012b565b8280fd5b634e487b7160e01b600052604160045260246000fd5b503d610142565b81513d85823e3d90fd5b9190503461017a578260031936011261017a57825483906001600160a01b0316803b156100e35760048483819363684ef04560e11b83525af19081156100ac57506101ee575080f35b6101f7906101fa565b80f35b67ffffffffffffffff811161017e5760405256fea2646970667358221220a54e617d68b83f8da207d03f3e2a6168921e2f16fe65e0f3a363ec9a95228b8b64736f6c634300081400336080806040523461001a57600160005560e190816100208239f35b600080fdfe60806040526004361015601157600080fd5b6000803560e01c80632baeceb714608c57806361bc221a1460715763d09de08a14603a57600080fd5b34606e5780600319360112606e5780546000198114605a57600101815580f35b634e487b7160e01b82526011600452602482fd5b80fd5b5034606e5780600319360112606e5760209054604051908152f35b5034606e5780600319360112606e5780548015605a5760001901815580f3fea26469706673582212202060735f33efd8beff8de6826d5bb836375daa8720f3aab6ae7d0e6280ecf05964736f6c63430008140033", - "deployedBytecode": "0x60806040818152600436101561001457600080fd5b600091823560e01c9081635b34b966146101a55750806372142b89146100e7578063aef38e72146100bc5763f5c5ad831461004e57600080fd5b8190346100b957816003193601126100b95781546001600160a01b031690813b156100b5578280926004835180958193632baeceb760e01b83525af19081156100ac57506100995750f35b6100a2906101fa565b6100a95780f35b80fd5b513d84823e3d90fd5b5050fd5b50fd5b50346100e357816003193601126100e357905490516001600160a01b039091168152602090f35b5080fd5b50346100e357816003193601126100e357815481516330de110d60e11b81529190602090839060049082906001600160a01b03165afa91821561019b578392610135575b6020838351908152f35b90915060203d8111610194575b601f8101601f1916820167ffffffffffffffff81118382101761017e57602091839185528101031261017a576020925051903861012b565b8280fd5b634e487b7160e01b600052604160045260246000fd5b503d610142565b81513d85823e3d90fd5b9190503461017a578260031936011261017a57825483906001600160a01b0316803b156100e35760048483819363684ef04560e11b83525af19081156100ac57506101ee575080f35b6101f7906101fa565b80f35b67ffffffffffffffff811161017e5760405256fea2646970667358221220a54e617d68b83f8da207d03f3e2a6168921e2f16fe65e0f3a363ec9a95228b8b64736f6c63430008140033", + "bytecode": "0x60808060405234607c5760f48181016001600160401b0381118382101760685782916102b4833903905ff08015605d575f80546001600160a01b0319166001600160a01b039290921691909117905560405161023390816100818239f35b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c9081635b34b966146101655750806372142b89146100dc578063aef38e72146100b55763f5c5ad831461004a575f80fd5b346100a457806003193601126100a457805481906001600160a01b0316803b156100b257818091600460405180948193632baeceb760e01b83525af180156100a7576100935750f35b8161009d916101c7565b6100a45780f35b80fd5b6040513d84823e3d90fd5b50fd5b50346100a457806003193601126100a457546040516001600160a01b039091168152602090f35b50346100a457806003193601126100a45780546040516330de110d60e11b815290602090829060049082906001600160a01b03165afa9081156100a757829161012b575b602082604051908152f35b90506020813d60201161015d575b81610146602093836101c7565b810103126101595760209150515f610120565b5080fd5b3d9150610139565b9050346101c3575f3660031901126101c3575f546001600160a01b0316803b156101c357816004815f809463684ef04560e11b83525af180156101b8576101aa575080f35b6101b691505f906101c7565b005b6040513d5f823e3d90fd5b5f80fd5b90601f8019910116810190811067ffffffffffffffff8211176101e957604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220b428515d7730a46207b5b161eb6c8290200a124bc51493b989af7e88ff65f7cc64736f6c634300081a00336080806040523460175760015f5560d89081601c8239f35b5f80fdfe608060405260043610156010575f80fd5b5f3560e01c80632baeceb714608657806361bc221a14606c5763d09de08a146036575f80fd5b346068575f3660031901126068575f545f1981146054576001015f55005b634e487b7160e01b5f52601160045260245ffd5b5f80fd5b346068575f36600319011260685760205f54604051908152f35b346068575f3660031901126068575f5480156054575f19015f5500fea2646970667358221220dddad0a8810a89d275a619dd1bf3eba00a164e71ae2c0c6ff097120d155bfa7a64736f6c634300081a0033", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f905f3560e01c9081635b34b966146101655750806372142b89146100dc578063aef38e72146100b55763f5c5ad831461004a575f80fd5b346100a457806003193601126100a457805481906001600160a01b0316803b156100b257818091600460405180948193632baeceb760e01b83525af180156100a7576100935750f35b8161009d916101c7565b6100a45780f35b80fd5b6040513d84823e3d90fd5b50fd5b50346100a457806003193601126100a457546040516001600160a01b039091168152602090f35b50346100a457806003193601126100a45780546040516330de110d60e11b815290602090829060049082906001600160a01b03165afa9081156100a757829161012b575b602082604051908152f35b90506020813d60201161015d575b81610146602093836101c7565b810103126101595760209150515f610120565b5080fd5b3d9150610139565b9050346101c3575f3660031901126101c3575f546001600160a01b0316803b156101c357816004815f809463684ef04560e11b83525af180156101b8576101aa575080f35b6101b691505f906101c7565b005b6040513d5f823e3d90fd5b5f80fd5b90601f8019910116810190811067ffffffffffffffff8211176101e957604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220b428515d7730a46207b5b161eb6c8290200a124bc51493b989af7e88ff65f7cc64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/eips/testdata/CounterFactory.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/evmd/tests/ibc/ics20_precompile_transfer_test.go b/evmd/tests/ibc/ics20_precompile_transfer_test.go index c7a70c6c8..e25fa7472 100644 --- a/evmd/tests/ibc/ics20_precompile_transfer_test.go +++ b/evmd/tests/ibc/ics20_precompile_transfer_test.go @@ -16,11 +16,13 @@ import ( "github.com/cosmos/evm" "github.com/cosmos/evm/evmd" "github.com/cosmos/evm/evmd/tests/integration" + cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/ics20" - chainutil "github.com/cosmos/evm/testutil" + precompiletestutil "github.com/cosmos/evm/precompiles/testutil" evmibctesting "github.com/cosmos/evm/testutil/ibc" evmante "github.com/cosmos/evm/x/vm/ante" "github.com/cosmos/evm/x/vm/statedb" + evmtypes "github.com/cosmos/evm/x/vm/types" transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v10/modules/core/02-client/types" @@ -310,9 +312,20 @@ func (suite *ICS20TransferTestSuite) TestHandleMsgTransfer() { "INVALID-DENOM-HASH", ) suite.Require().ErrorContains(err, vm.ErrExecutionReverted.Error()) - - revertErr := chainutil.DecodeRevertReason(*evmRes) - suite.Require().Contains(revertErr.Error(), "invalid denom trace hash") + denomReq, errBuild := ics20.NewDenomRequest([]interface{}{"INVALID-DENOM-HASH"}) + suite.Require().NoError(errBuild) + _, qerr := evmAppB.TransferKeeper.Denom(sdk.WrapSDKContext(ctxB), denomReq) + suite.Require().Error(qerr) + precompiletestutil.RequireExactError( + suite.T(), + evmtypes.NewExecErrorWithReason(evmRes.Ret), + cmn.NewRevertWithSolidityError( + suite.chainBPrecompile.ABI, + cmn.SolidityErrQueryFailed, + ics20.DenomMethod, + qerr.Error(), + ), + ) ctxB.GasMeter().RefundGas(ctxB.GasMeter().Limit(), "refund after error") // denomHash query method @@ -366,9 +379,20 @@ func (suite *ICS20TransferTestSuite) TestHandleMsgTransfer() { "", ) suite.Require().ErrorContains(err, vm.ErrExecutionReverted.Error()) - - revertErr = chainutil.DecodeRevertReason(*evmRes) - suite.Require().Contains(revertErr.Error(), "invalid denomination for cross-chain transfer") + hashReq, errBuild := ics20.NewDenomHashRequest([]interface{}{""}) + suite.Require().NoError(errBuild) + _, qerrHash := evmAppB.TransferKeeper.DenomHash(sdk.WrapSDKContext(ctxB), hashReq) + suite.Require().Error(qerrHash) + precompiletestutil.RequireExactError( + suite.T(), + evmtypes.NewExecErrorWithReason(evmRes.Ret), + cmn.NewRevertWithSolidityError( + suite.chainBPrecompile.ABI, + cmn.SolidityErrQueryFailed, + ics20.DenomHashMethod, + qerrHash.Error(), + ), + ) ctxB.GasMeter().RefundGas(ctxB.GasMeter().Limit(), "refund after error") }) } diff --git a/evmd/tests/ibc/v2_ics20_precompile_transfer_test.go b/evmd/tests/ibc/v2_ics20_precompile_transfer_test.go index 01421ddb7..6be35f93d 100644 --- a/evmd/tests/ibc/v2_ics20_precompile_transfer_test.go +++ b/evmd/tests/ibc/v2_ics20_precompile_transfer_test.go @@ -17,11 +17,13 @@ import ( "github.com/cosmos/evm" "github.com/cosmos/evm/evmd" "github.com/cosmos/evm/evmd/tests/integration" + cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/ics20" - chainutil "github.com/cosmos/evm/testutil" + precompiletestutil "github.com/cosmos/evm/precompiles/testutil" evmibctesting "github.com/cosmos/evm/testutil/ibc" evmante "github.com/cosmos/evm/x/vm/ante" "github.com/cosmos/evm/x/vm/statedb" + evmtypes "github.com/cosmos/evm/x/vm/types" transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v10/modules/core/02-client/types" @@ -316,8 +318,20 @@ func (suite *ICS20TransferV2TestSuite) TestHandleMsgTransfer() { "INVALID-DENOM-HASH", ) suite.Require().ErrorContains(err, vm.ErrExecutionReverted.Error()) - revertErr := chainutil.DecodeRevertReason(*evmRes) - suite.Require().Contains(revertErr.Error(), "invalid denom trace hash") + denomReq, errBuild := ics20.NewDenomRequest([]interface{}{"INVALID-DENOM-HASH"}) + suite.Require().NoError(errBuild) + _, qerr := evmAppB.TransferKeeper.Denom(sdk.WrapSDKContext(ctxB), denomReq) + suite.Require().Error(qerr) + precompiletestutil.RequireExactError( + suite.T(), + evmtypes.NewExecErrorWithReason(evmRes.Ret), + cmn.NewRevertWithSolidityError( + suite.chainBPrecompile.ABI, + cmn.SolidityErrQueryFailed, + ics20.DenomMethod, + qerr.Error(), + ), + ) ctxB.GasMeter().RefundGas(ctxB.GasMeter().Limit(), "refund after error") // denomHash query method @@ -371,8 +385,20 @@ func (suite *ICS20TransferV2TestSuite) TestHandleMsgTransfer() { "", ) suite.Require().ErrorContains(err, vm.ErrExecutionReverted.Error()) - revertErr = chainutil.DecodeRevertReason(*evmRes) - suite.Require().Contains(revertErr.Error(), "invalid denomination for cross-chain transfer") + hashReq, errBuild := ics20.NewDenomHashRequest([]interface{}{""}) + suite.Require().NoError(errBuild) + _, qerrHash := evmAppB.TransferKeeper.DenomHash(sdk.WrapSDKContext(ctxB), hashReq) + suite.Require().Error(qerrHash) + precompiletestutil.RequireExactError( + suite.T(), + evmtypes.NewExecErrorWithReason(evmRes.Ret), + cmn.NewRevertWithSolidityError( + suite.chainBPrecompile.ABI, + cmn.SolidityErrQueryFailed, + ics20.DenomHashMethod, + qerrHash.Error(), + ), + ) ctxB.GasMeter().RefundGas(ctxB.GasMeter().Limit(), "refund after error") }) } diff --git a/precompiles/bank/IBank.sol b/precompiles/bank/IBank.sol index 7c85d7279..0e0c245bd 100644 --- a/precompiles/bank/IBank.sol +++ b/precompiles/bank/IBank.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.18; +import "../common/Types.sol"; + /// @dev The IBank contract's address. address constant IBANK_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000804; @@ -20,7 +22,7 @@ struct Balance { * @title Bank Interface * @dev Interface for querying balances and supply from the Bank module. */ -interface IBank { +interface IBank is IPrecompile { /// @dev balances defines a method for retrieving all the native token balances /// for a given account. /// @param account the address of the account to query balances for. diff --git a/precompiles/bank/abi.json b/precompiles/bank/abi.json index 2c7ad29c7..47f4e0769 100644 --- a/precompiles/bank/abi.json +++ b/precompiles/bank/abi.json @@ -1,4 +1,166 @@ [ + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ABISetupFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "eventKind", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EventEmitFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "bad", + "type": "string" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "amount", + "type": "string" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "height", + "type": "string" + } + ], + "name": "InvalidHeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + } + ], + "name": "InvalidNumberOfArgs", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "pubkey", + "type": "string" + } + ], + "name": "InvalidPubkey", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPubkeySize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msgMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "MsgServerFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "queryMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "QueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + } + ], + "name": "RequesterIsNotMsgSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "methodName", + "type": "string" + } + ], + "name": "UnknownMethod", + "type": "error" + }, { "inputs": [ { diff --git a/precompiles/bank/bank.go b/precompiles/bank/bank.go index 5da9aef5a..5d1ef796d 100644 --- a/precompiles/bank/bank.go +++ b/precompiles/bank/bank.go @@ -7,7 +7,6 @@ package bank import ( "bytes" - "fmt" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -131,7 +130,7 @@ func (p Precompile) Execute(ctx sdk.Context, contract *vm.Contract, readOnly boo case SupplyOfMethod: bz, err = p.SupplyOf(ctx, method, args) default: - return nil, fmt.Errorf(cmn.ErrUnknownMethod, method.Name) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrUnknownMethod, method.Name) } return bz, err diff --git a/precompiles/bank/query.go b/precompiles/bank/query.go index a7fc2e8f0..92d69ff41 100644 --- a/precompiles/bank/query.go +++ b/precompiles/bank/query.go @@ -1,7 +1,6 @@ package bank import ( - "fmt" "math/big" "github.com/ethereum/go-ethereum/accounts/abi" @@ -33,12 +32,11 @@ func (p Precompile) Balances( ) ([]byte, error) { account, err := ParseBalancesArgs(args) if err != nil { - return nil, fmt.Errorf("error calling account balances in bank precompile: %s", err) + return nil, err } i := 0 balances := make([]Balance, 0) - p.bankKeeper.IterateAccountBalances(ctx, account, func(coin sdk.Coin) bool { defer func() { i++ }() @@ -60,7 +58,6 @@ func (p Precompile) Balances( return false }) - return method.Outputs.Pack(balances) } @@ -76,7 +73,6 @@ func (p Precompile) TotalSupply( ) ([]byte, error) { i := 0 totalSupply := make([]Balance, 0) - p.bankKeeper.IterateTotalSupply(ctx, func(coin sdk.Coin) bool { defer func() { i++ }() @@ -114,7 +110,7 @@ func (p Precompile) SupplyOf( ) ([]byte, error) { erc20ContractAddress, err := ParseSupplyOfArgs(args) if err != nil { - return nil, fmt.Errorf("error getting the supply in bank precompile: %s", err) + return nil, err } tokenPairID := p.erc20Keeper.GetERC20Map(ctx, erc20ContractAddress) diff --git a/precompiles/bank/testdata/BankCaller.json b/precompiles/bank/testdata/BankCaller.json index ae0f8dfef..55944dc3a 100644 --- a/precompiles/bank/testdata/BankCaller.json +++ b/precompiles/bank/testdata/BankCaller.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "BankCaller", "sourceName": "solidity/precompiles/bank/testdata/BankCaller.sol", "abi": [ @@ -103,8 +103,11 @@ "type": "function" } ], - "bytecode": "0x608080604052346100165761045b908161001c8239f35b600080fdfe60806040908082526004908136101561001757600080fd5b600090813560e01c90816389129c681461024557508063acab2f94146101cd578063bba60ca01461012b5763d47052031461005157600080fd5b34610128576020366003190112610128575a90835192602084016318160ddd60e01b81528185528585019467ffffffffffffffff95818110878211176101155787525183918291906108048535fa933d1561010f573d9081116100fc578551906100c5601f8201601f191660200183610317565b81528260203d92013e5b5a83039283116100e9575050825191151582526020820152f35b634e487b7160e01b825260119052602490fd5b634e487b7160e01b835260418252602483fd5b506100cf565b634e487b7160e01b855260418452602485fd5b80fd5b5082346101c957602092836003193601126101c55780356001600160a01b038116908190036101c1578251631890039360e21b81529182015283816024816108045afa9283156101b6578093610184575b505051908152f35b909192508382813d83116101af575b61019d8183610317565b8101031261012857505190838061017c565b503d610193565b8251903d90823e3d90fd5b8380fd5b8280fd5b5080fd5b5091346101c557826003193601126101c55782815180936318160ddd60e01b8252816108045afa91821561023b57836102129493610216575b505051918291826102c4565b0390f35b6102339293503d8091833e61022b8183610317565b81019061034f565b903880610206565b81513d85823e3d90fd5b90508383346101c15760203660031901126101c15780356001600160a01b03811691908290036102c0576327e235e360e01b845283015282826024816108045afa91821561023b578361021294936102a357505051918291826102c4565b6102b89293503d8091833e61022b8183610317565b908380610206565b8480fd5b60208082019080835283518092528060408094019401926000905b8382106102ee57505050505090565b845180516001600160a01b031687528301518684015294850194938201936001909101906102df565b90601f8019910116810190811067ffffffffffffffff82111761033957604052565b634e487b7160e01b600052604160045260246000fd5b6020808284031261040b57815167ffffffffffffffff9283821161040b57019083601f8301121561040b57815183811161033957604093845195610398848460051b0188610317565b828752838088019360061b8601019481861161040b578401925b8584106103c3575050505050505090565b868483031261040b57865190878201828110858211176104105788528451906001600160a01b038216820361040b578287928a945282870151838201528152019301926103b2565b600080fd5b60246000634e487b7160e01b81526041600452fdfea26469706673582212206291c412c52d95f56ebd6bcace337eb3149a918c5ed8398ed4845c859755136a64736f6c63430008140033", - "deployedBytecode": "0x60806040908082526004908136101561001757600080fd5b600090813560e01c90816389129c681461024557508063acab2f94146101cd578063bba60ca01461012b5763d47052031461005157600080fd5b34610128576020366003190112610128575a90835192602084016318160ddd60e01b81528185528585019467ffffffffffffffff95818110878211176101155787525183918291906108048535fa933d1561010f573d9081116100fc578551906100c5601f8201601f191660200183610317565b81528260203d92013e5b5a83039283116100e9575050825191151582526020820152f35b634e487b7160e01b825260119052602490fd5b634e487b7160e01b835260418252602483fd5b506100cf565b634e487b7160e01b855260418452602485fd5b80fd5b5082346101c957602092836003193601126101c55780356001600160a01b038116908190036101c1578251631890039360e21b81529182015283816024816108045afa9283156101b6578093610184575b505051908152f35b909192508382813d83116101af575b61019d8183610317565b8101031261012857505190838061017c565b503d610193565b8251903d90823e3d90fd5b8380fd5b8280fd5b5080fd5b5091346101c557826003193601126101c55782815180936318160ddd60e01b8252816108045afa91821561023b57836102129493610216575b505051918291826102c4565b0390f35b6102339293503d8091833e61022b8183610317565b81019061034f565b903880610206565b81513d85823e3d90fd5b90508383346101c15760203660031901126101c15780356001600160a01b03811691908290036102c0576327e235e360e01b845283015282826024816108045afa91821561023b578361021294936102a357505051918291826102c4565b6102b89293503d8091833e61022b8183610317565b908380610206565b8480fd5b60208082019080835283518092528060408094019401926000905b8382106102ee57505050505090565b845180516001600160a01b031687528301518684015294850194938201936001909101906102df565b90601f8019910116810190811067ffffffffffffffff82111761033957604052565b634e487b7160e01b600052604160045260246000fd5b6020808284031261040b57815167ffffffffffffffff9283821161040b57019083601f8301121561040b57815183811161033957604093845195610398848460051b0188610317565b828752838088019360061b8601019481861161040b578401925b8584106103c3575050505050505090565b868483031261040b57865190878201828110858211176104105788528451906001600160a01b038216820361040b578287928a945282870151838201528152019301926103b2565b600080fd5b60246000634e487b7160e01b81526041600452fdfea26469706673582212206291c412c52d95f56ebd6bcace337eb3149a918c5ed8398ed4845c859755136a64736f6c63430008140033", + "bytecode": "0x608080604052346015576103db908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816389129c681461020f57508063acab2f94146101a4578063bba60ca01461010a5763d470520314610048575f80fd5b34610106576020366003190112610106575a5f8060405160208101906318160ddd60e01b82526004815261007d6024826102b5565b5190610804600435fa3d15610101573d67ffffffffffffffff81116100ed57604051906100b4601f8201601f1916602001836102b5565b81525f60203d92013e5b5a82039182116100d957604091825191151582526020820152f35b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6100be565b5f80fd5b34610106576020366003190112610106576004356001600160a01b038116908190036101065760405190631890039360e21b825260048201526020816024816108045afa8015610199575f90610166575b602090604051908152f35b506020813d602011610191575b81610180602093836102b5565b81010312610106576020905161015b565b3d9150610173565b6040513d5f823e3d90fd5b34610106575f366003190112610106576040516318160ddd60e01b81525f816004816108045afa8015610199576101e9915f916101ed575b5060405191829182610267565b0390f35b61020991503d805f833e61020181836102b5565b8101906102d7565b826101dc565b34610106576020366003190112610106576004356001600160a01b03811690819003610106576327e235e360e01b825260048201525f816024816108045afa8015610199576101e9915f916101ed5750604051918291825b60206040818301928281528451809452019201905f5b81811061028a5750505090565b825180516001600160a01b03168552602090810151818601526040909401939092019160010161027d565b90601f8019910116810190811067ffffffffffffffff8211176100ed57604052565b6020818303126101065780519067ffffffffffffffff8211610106570181601f820112156101065780519067ffffffffffffffff82116100ed576040519261032560208460051b01856102b5565b82845260208085019360061b8301019181831161010657602001925b82841061034f575050505090565b60408483031261010657604051906040820182811067ffffffffffffffff8211176100ed576040528451906001600160a01b0382168203610106578260209260409452828701518382015281520193019261034156fea26469706673582212201df492823921705e65849b321fae2598c3600dafab74456f106dadee538e526c64736f6c634300081a0033", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c90816389129c681461020f57508063acab2f94146101a4578063bba60ca01461010a5763d470520314610048575f80fd5b34610106576020366003190112610106575a5f8060405160208101906318160ddd60e01b82526004815261007d6024826102b5565b5190610804600435fa3d15610101573d67ffffffffffffffff81116100ed57604051906100b4601f8201601f1916602001836102b5565b81525f60203d92013e5b5a82039182116100d957604091825191151582526020820152f35b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6100be565b5f80fd5b34610106576020366003190112610106576004356001600160a01b038116908190036101065760405190631890039360e21b825260048201526020816024816108045afa8015610199575f90610166575b602090604051908152f35b506020813d602011610191575b81610180602093836102b5565b81010312610106576020905161015b565b3d9150610173565b6040513d5f823e3d90fd5b34610106575f366003190112610106576040516318160ddd60e01b81525f816004816108045afa8015610199576101e9915f916101ed575b5060405191829182610267565b0390f35b61020991503d805f833e61020181836102b5565b8101906102d7565b826101dc565b34610106576020366003190112610106576004356001600160a01b03811690819003610106576327e235e360e01b825260048201525f816024816108045afa8015610199576101e9915f916101ed5750604051918291825b60206040818301928281528451809452019201905f5b81811061028a5750505090565b825180516001600160a01b03168552602090810151818601526040909401939092019160010161027d565b90601f8019910116810190811067ffffffffffffffff8211176100ed57604052565b6020818303126101065780519067ffffffffffffffff8211610106570181601f820112156101065780519067ffffffffffffffff82116100ed576040519261032560208460051b01856102b5565b82845260208085019360061b8301019181831161010657602001925b82841061034f575050505090565b60408483031261010657604051906040820182811067ffffffffffffffff8211176100ed576040528451906001600160a01b0382168203610106578260209260409452828701518382015281520193019261034156fea26469706673582212201df492823921705e65849b321fae2598c3600dafab74456f106dadee538e526c64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/bank/testdata/BankCaller.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/bank/types.go b/precompiles/bank/types.go index 828893b7f..ef1c6100e 100644 --- a/precompiles/bank/types.go +++ b/precompiles/bank/types.go @@ -20,12 +20,12 @@ type Balance struct { // ParseBalancesArgs parses the call arguments for the bank Balances query. func ParseBalancesArgs(args []interface{}) (sdk.AccAddress, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } account, ok := args[0].(common.Address) if !ok { - return nil, fmt.Errorf(cmn.ErrInvalidType, "account", common.Address{}, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } return account.Bytes(), nil @@ -34,12 +34,12 @@ func ParseBalancesArgs(args []interface{}) (sdk.AccAddress, error) { // ParseSupplyOfArgs parses the call arguments for the bank SupplyOf query. func ParseSupplyOfArgs(args []interface{}) (common.Address, error) { if len(args) != 1 { - return common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } erc20Address, ok := args[0].(common.Address) if !ok { - return common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "erc20Address", common.Address{}, args[0]) + return common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } return erc20Address, nil diff --git a/precompiles/bech32/Bech32I.sol b/precompiles/bech32/Bech32I.sol index 7d1c65a15..faaa26190 100644 --- a/precompiles/bech32/Bech32I.sol +++ b/precompiles/bech32/Bech32I.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.17; +import "../common/Types.sol"; + /// @dev The Bech32I contract's address. address constant Bech32_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000400; @@ -12,7 +14,7 @@ Bech32I constant BECH32_CONTRACT = Bech32I(Bech32_PRECOMPILE_ADDRESS); /// @dev The interface through which solidity contracts can convert addresses from /// hex to bech32 and vice versa. /// @custom:address 0x0000000000000000000000000000000000000400 -interface Bech32I { +interface Bech32I is IPrecompile { /// @dev Defines a method for converting a hex formatted address to bech32. /// @param addr The hex address to be converted. /// @param prefix The human readable prefix (HRP) of the bech32 address. diff --git a/precompiles/bech32/abi.json b/precompiles/bech32/abi.json index 7d9144759..97d6919f4 100644 --- a/precompiles/bech32/abi.json +++ b/precompiles/bech32/abi.json @@ -1,4 +1,166 @@ [ + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ABISetupFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "eventKind", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EventEmitFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "bad", + "type": "string" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "amount", + "type": "string" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "height", + "type": "string" + } + ], + "name": "InvalidHeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + } + ], + "name": "InvalidNumberOfArgs", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "pubkey", + "type": "string" + } + ], + "name": "InvalidPubkey", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPubkeySize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msgMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "MsgServerFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "queryMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "QueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + } + ], + "name": "RequesterIsNotMsgSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "methodName", + "type": "string" + } + ], + "name": "UnknownMethod", + "type": "error" + }, { "inputs": [ { diff --git a/precompiles/bech32/bech32.go b/precompiles/bech32/bech32.go index aad621154..40e33c9d0 100644 --- a/precompiles/bech32/bech32.go +++ b/precompiles/bech32/bech32.go @@ -10,6 +10,7 @@ import ( _ "embed" + cmn "github.com/cosmos/evm/precompiles/common" evmtypes "github.com/cosmos/evm/x/vm/types" ) @@ -61,10 +62,10 @@ func (p Precompile) RequiredGas(_ []byte) uint64 { } // Run executes the precompiled contract bech32 methods defined in the ABI. -func (p Precompile) Run(_ *vm.EVM, contract *vm.Contract, _ bool) (bz []byte, err error) { +func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, _ bool) (bz []byte, err error) { // NOTE: This check avoid panicking when trying to decode the method ID if len(contract.Input) < 4 { - return nil, vm.ErrExecutionReverted + return cmn.ReturnRevertError(evm, vm.ErrExecutionReverted) } methodID := contract.Input[:4] @@ -72,13 +73,13 @@ func (p Precompile) Run(_ *vm.EVM, contract *vm.Contract, _ bool) (bz []byte, er // the method with the given ID method, err := p.MethodById(methodID) if err != nil { - return nil, err + return cmn.ReturnRevertError(evm, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrUnknownMethod, fmt.Sprintf("0x%x", methodID))) } argsBz := contract.Input[4:] args, err := method.Inputs.Unpack(argsBz) if err != nil { - return nil, err + return cmn.ReturnRevertError(evm, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrABISetupFailed, err.Error())) } switch method.Name { @@ -89,7 +90,7 @@ func (p Precompile) Run(_ *vm.EVM, contract *vm.Contract, _ bool) (bz []byte, er } if err != nil { - return nil, err + return cmn.ReturnRevertError(evm, err) } return bz, nil diff --git a/precompiles/bech32/methods.go b/precompiles/bech32/methods.go index a88e7c1b9..1059f7630 100644 --- a/precompiles/bech32/methods.go +++ b/precompiles/bech32/methods.go @@ -2,6 +2,7 @@ package bech32 import ( "fmt" + "math/big" "strings" "github.com/ethereum/go-ethereum/accounts/abi" @@ -24,37 +25,37 @@ const ( // HexToBech32 converts a hex address to its corresponding Bech32 format. The Human Readable Prefix // (HRP) must be provided in the arguments. This function fails if the address is invalid or if the // bech32 conversion fails. -func (p Precompile) HexToBech32( +func (Precompile) HexToBech32( method *abi.Method, args []interface{}, ) ([]byte, error) { if len(args) != 2 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } address, ok := args[0].(common.Address) if !ok { - return nil, fmt.Errorf("invalid hex address") + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } cfg := sdk.GetConfig() prefix, _ := args[1].(string) if strings.TrimSpace(prefix) == "" { - return nil, fmt.Errorf( - "invalid bech32 human readable prefix (HRP). Please provide a either an account, validator or consensus address prefix (eg: %s, %s, %s)", + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf( + "invalid HRP: empty; expected account (%s), validator (%s), or consensus (%s) style prefix", cfg.GetBech32AccountAddrPrefix(), cfg.GetBech32ValidatorAddrPrefix(), cfg.GetBech32ConsensusAddrPrefix(), - ) + )) } // NOTE: safety check, should not happen given that the address is 20 bytes. if err := sdk.VerifyAddressFormat(address.Bytes()); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, err.Error()) } bech32Str, err := sdk.Bech32ifyAddressBytes(prefix, address.Bytes()) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrQueryFailed, HexToBech32Method, err.Error()) } return method.Outputs.Pack(bech32Str) @@ -63,31 +64,31 @@ func (p Precompile) HexToBech32( // Bech32ToHex converts a bech32 address to its corresponding EIP-55 hex format. The Human Readable Prefix // (HRP) must be provided in the arguments. This function fails if the address is invalid or if the // bech32 conversion fails. -func (p Precompile) Bech32ToHex( +func (Precompile) Bech32ToHex( method *abi.Method, args []interface{}, ) ([]byte, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } address, ok := args[0].(string) if !ok || address == "" { - return nil, fmt.Errorf("invalid bech32 address: %v", args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } bech32Prefix := strings.SplitN(address, "1", 2)[0] if bech32Prefix == address { - return nil, fmt.Errorf("invalid bech32 address: %s", address) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, address) } addressBz, err := sdk.GetFromBech32(address, bech32Prefix) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrQueryFailed, Bech32ToHexMethod, err.Error()) } if err := sdk.VerifyAddressFormat(addressBz); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, err.Error()) } return method.Outputs.Pack(common.BytesToAddress(addressBz)) diff --git a/precompiles/common/Types.sol b/precompiles/common/Types.sol index deeb78d03..1461491d1 100644 --- a/precompiles/common/Types.sol +++ b/precompiles/common/Types.sol @@ -62,3 +62,18 @@ struct Height { // the height within the given revision uint64 revisionHeight; } + +interface IPrecompile { + error RequesterIsNotMsgSender(address msgSender, address requester); + error InvalidAddress(string bad); + error InvalidAmount(string amount); + error InvalidHeight(string height); + error InvalidPubkey(string pubkey); + error InvalidPubkeySize(uint256 got, uint256 expected); + error ABISetupFailed(string reason); + error InvalidNumberOfArgs(uint256 expected, uint256 got); + error UnknownMethod(string methodName); + error QueryFailed(string queryMethod, string reason); + error MsgServerFailed(string msgMethod, string reason); + error EventEmitFailed(string eventKind, string reason); +} diff --git a/precompiles/common/errors.go b/precompiles/common/errors.go index 2540f9732..367e110de 100644 --- a/precompiles/common/errors.go +++ b/precompiles/common/errors.go @@ -33,4 +33,29 @@ const ( ErrInvalidDescription = "invalid description: %v" // ErrInvalidCommission is raised when the input commission cannot be cast to stakingtypes.CommissionRates{}. ErrInvalidCommission = "invalid commission: %v" + + // SolidityErrInvalidNumberOfArgs is invalid number of arguments + SolidityErrInvalidNumberOfArgs = "InvalidNumberOfArgs" + // SolidityErrInvalidAddress is invalid address + SolidityErrInvalidAddress = "InvalidAddress" + // SolidityErrInvalidAmount is invalid amount + SolidityErrInvalidAmount = "InvalidAmount" + // SolidityErrRequesterIsNotMsgSender is requester is not msg sender + SolidityErrRequesterIsNotMsgSender = "RequesterIsNotMsgSender" + // SolidityErrInvalidHeight is invalid height + SolidityErrInvalidHeight = "InvalidHeight" + // SolidityErrInvalidPubkey is invalid pubkey + SolidityErrInvalidPubkey = "InvalidPubkey" + // SolidityErrInvalidPubkeySize is invalid pubkey size + SolidityErrInvalidPubkeySize = "InvalidPubkeySize" + // SolidityErrABISetupFailed is abi setup failed + SolidityErrABISetupFailed = "ABISetupFailed" + // SolidityErrUnknownMethod is unknown method + SolidityErrUnknownMethod = "UnknownMethod" + // SolidityErrQueryFailed is query failed + SolidityErrQueryFailed = "QueryFailed" + // SolidityErrMsgServerFailed is msg server failed + SolidityErrMsgServerFailed = "MsgServerFailed" + // SolidityErrEventEmitFailed is event emit failed + SolidityErrEventEmitFailed = "EventEmitFailed" ) diff --git a/precompiles/common/revert.go b/precompiles/common/revert.go index 828248a6d..947535d76 100644 --- a/precompiles/common/revert.go +++ b/precompiles/common/revert.go @@ -1,27 +1,76 @@ package common import ( + "errors" + + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" evmtypes "github.com/cosmos/evm/x/vm/types" ) -// ReturnRevertError returns a ExecutionReverted error with revert reason -// that should align with the behavior of go-ethereum implementation. -// -// In the EVM interpreter, an opCall error is reported as ExecutionReverted, -// and its revert reason is stored in EVM memory and then returned by opRevert. -// Since precompiles are also invoked via opCall, they should be handled the same way. -// Therefore, the returned error must be ABI-encoded and returned, -// and the error type changed to ErrExecutionReverted. -// -// related issue: https://github.com/cosmos/evm/issues/223 +func setInterpreterReturnData(evm *vm.EVM, data []byte) { + if evm == nil || evm.Interpreter() == nil { + return + } + evm.Interpreter().SetReturnData(data) +} + +// RevertDataCarrier is an error that carries ABI-encoded revert data. +type RevertDataCarrier interface { + error + RevertData() []byte +} + +// RevertWithData carries ABI-encoded custom error data. +type RevertWithData struct { + data []byte +} + +func (e *RevertWithData) Error() string { + return vm.ErrExecutionReverted.Error() +} + +func (e *RevertWithData) RevertData() []byte { + return e.data +} + +// NewRevertWithSolidityError packs args using the provided module ABI's error definition. +// It avoids hardcoding ABI information in Go by relying on the Solidity-generated ABI. +func NewRevertWithSolidityError(moduleABI abi.ABI, errorName string, args ...interface{}) error { + customErr, ok := moduleABI.Errors[errorName] + if !ok { + reason := "unknown solidity custom error: " + errorName + revertReasonBz, encErr := evmtypes.RevertReasonBytes(reason) + if encErr != nil { + return errors.New(reason) + } + return &RevertWithData{data: revertReasonBz} + } + + data, err := customErr.Inputs.Pack(args...) + if err != nil { + return err + } + return &RevertWithData{data: append(customErr.ID[:4], data...)} +} + +// ReturnRevertError maps precompile failures to vm.ErrExecutionReverted, sets interpreter +// return data when possible, and returns the same revert bytes as the call result (for opCall). +// See https://github.com/cosmos/evm/issues/223 func ReturnRevertError(evm *vm.EVM, err error) ([]byte, error) { + var carrier RevertDataCarrier + if errors.As(err, &carrier) { + data := carrier.RevertData() + setInterpreterReturnData(evm, data) + return data, vm.ErrExecutionReverted + } + revertReasonBz, encErr := evmtypes.RevertReasonBytes(err.Error()) if encErr != nil { return nil, vm.ErrExecutionReverted } - evm.Interpreter().SetReturnData(revertReasonBz) + setInterpreterReturnData(evm, revertReasonBz) return revertReasonBz, vm.ErrExecutionReverted } diff --git a/precompiles/common/revert_test.go b/precompiles/common/revert_test.go new file mode 100644 index 000000000..3fd1e3fc3 --- /dev/null +++ b/precompiles/common/revert_test.go @@ -0,0 +1,38 @@ +package common_test + +import ( + "errors" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" + "github.com/stretchr/testify/require" + + cmn "github.com/cosmos/evm/precompiles/common" + "github.com/cosmos/evm/precompiles/staking" + statedbmocks "github.com/cosmos/evm/x/vm/statedb/mocks" +) + +func TestReturnRevertError_WithCustomData(t *testing.T) { + stateDB := statedbmocks.NewStateDB(t) + evm := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1), Time: 1}, stateDB, params.TestChainConfig, vm.Config{}) + + customErr := cmn.NewRevertWithSolidityError(staking.ABI, "RequesterIsNotMsgSender", common.Address{0x1}, common.Address{0x2}) + ret, err := cmn.ReturnRevertError(evm, customErr) + + require.ErrorIs(t, err, vm.ErrExecutionReverted) + require.Len(t, ret, 4+32+32) + require.Equal(t, ret, evm.Interpreter().ReturnData()) +} + +func TestReturnRevertError_WithStringFallback(t *testing.T) { + stateDB := statedbmocks.NewStateDB(t) + evm := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1), Time: 1}, stateDB, params.TestChainConfig, vm.Config{}) + + ret, err := cmn.ReturnRevertError(evm, errors.New("fallback message")) + + require.ErrorIs(t, err, vm.ErrExecutionReverted) + require.NotEmpty(t, ret) +} diff --git a/precompiles/distribution/DistributionI.sol b/precompiles/distribution/DistributionI.sol index cd98b6323..877df0f44 100644 --- a/precompiles/distribution/DistributionI.sol +++ b/precompiles/distribution/DistributionI.sol @@ -36,7 +36,11 @@ struct DelegationDelegatorReward { /// @title Distribution Precompile Contract /// @dev The interface through which solidity contracts will interact with Distribution /// @custom:address 0x0000000000000000000000000000000000000801 -interface DistributionI { +interface DistributionI is IPrecompile { + error DistributionInputInvalid(string callMethod, string reason); + error DistributionValidatorSlashesUnpackFailed(string reason); + error ClaimRewardsMaxRetrieveExceeded(uint32 maxRetrieve, uint32 maxValidators); + /// @dev ClaimRewards defines an Event emitted when rewards are claimed /// @param delegatorAddress the address of the delegator /// @param amount the amount being claimed diff --git a/precompiles/distribution/abi.json b/precompiles/distribution/abi.json index 32c28715a..251911be4 100644 --- a/precompiles/distribution/abi.json +++ b/precompiles/distribution/abi.json @@ -1,4 +1,209 @@ [ + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ABISetupFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxRetrieve", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "maxValidators", + "type": "uint32" + } + ], + "name": "ClaimRewardsMaxRetrieveExceeded", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "DistributionInputInvalid", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "DistributionValidatorSlashesUnpackFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "eventKind", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EventEmitFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "bad", + "type": "string" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "amount", + "type": "string" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "height", + "type": "string" + } + ], + "name": "InvalidHeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + } + ], + "name": "InvalidNumberOfArgs", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "pubkey", + "type": "string" + } + ], + "name": "InvalidPubkey", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPubkeySize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msgMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "MsgServerFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "queryMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "QueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + } + ], + "name": "RequesterIsNotMsgSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "methodName", + "type": "string" + } + ], + "name": "UnknownMethod", + "type": "error" + }, { "anonymous": false, "inputs": [ diff --git a/precompiles/distribution/distribution.go b/precompiles/distribution/distribution.go index fb53acd6b..0ffc91d6c 100644 --- a/precompiles/distribution/distribution.go +++ b/precompiles/distribution/distribution.go @@ -2,7 +2,6 @@ package distribution import ( "bytes" - "fmt" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -105,7 +104,7 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]by func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Contract, readOnly bool) ([]byte, error) { method, args, err := cmn.SetupABI(p.ABI, contract, readOnly, p.IsTransaction) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrABISetupFailed, err.Error()) } var bz []byte @@ -145,7 +144,7 @@ func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Co case CommunityPoolMethod: bz, err = p.CommunityPool(ctx, contract, method, args) default: - return nil, fmt.Errorf(cmn.ErrUnknownMethod, method.Name) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrUnknownMethod, method.Name) } return bz, err diff --git a/precompiles/distribution/errors.go b/precompiles/distribution/errors.go index f7cf4fd4b..f50a05368 100644 --- a/precompiles/distribution/errors.go +++ b/precompiles/distribution/errors.go @@ -5,4 +5,9 @@ const ( ErrDifferentValidator = "origin address %s is not the same as validator address %s" // ErrInvalidAmount is raised when the given sdk coins amount is invalid ErrInvalidAmount = "invalid amount %s" + + // Solidity custom error names defined in DistributionI. + SolidityErrDistributionInputInvalid = "DistributionInputInvalid" + SolidityErrDistributionValidatorSlashesUnpackFailed = "DistributionValidatorSlashesUnpackFailed" + SolidityErrClaimRewardsMaxRetrieveExceeded = "ClaimRewardsMaxRetrieveExceeded" ) diff --git a/precompiles/distribution/query.go b/precompiles/distribution/query.go index 0c80e5175..db1dcc29b 100644 --- a/precompiles/distribution/query.go +++ b/precompiles/distribution/query.go @@ -53,7 +53,7 @@ func (p Precompile) ValidatorDistributionInfo( res, err := p.distributionQuerier.ValidatorDistributionInfo(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ValidatorDistributionInfoMethod, err.Error()) } out := new(ValidatorDistributionInfoOutput).FromResponse(res) @@ -75,7 +75,7 @@ func (p Precompile) ValidatorOutstandingRewards( res, err := p.distributionQuerier.ValidatorOutstandingRewards(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ValidatorOutstandingRewardsMethod, err.Error()) } return method.Outputs.Pack(cmn.NewDecCoinsResponse(res.Rewards.Rewards)) @@ -95,7 +95,7 @@ func (p Precompile) ValidatorCommission( res, err := p.distributionQuerier.ValidatorCommission(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ValidatorCommissionMethod, err.Error()) } return method.Outputs.Pack(cmn.NewDecCoinsResponse(res.Commission.Commission)) @@ -115,7 +115,7 @@ func (p Precompile) ValidatorSlashes( res, err := p.distributionQuerier.ValidatorSlashes(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ValidatorSlashesMethod, err.Error()) } out := new(ValidatorSlashesOutput).FromResponse(res) @@ -137,7 +137,7 @@ func (p Precompile) DelegationRewards( res, err := p.distributionQuerier.DelegationRewards(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, DelegationRewardsMethod, err.Error()) } return method.Outputs.Pack(cmn.NewDecCoinsResponse(res.Rewards)) @@ -157,7 +157,7 @@ func (p Precompile) DelegationTotalRewards( res, err := p.distributionQuerier.DelegationTotalRewards(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, DelegationTotalRewardsMethod, err.Error()) } out := new(DelegationTotalRewardsOutput).FromResponse(res) @@ -179,7 +179,7 @@ func (p Precompile) DelegatorValidators( res, err := p.distributionQuerier.DelegatorValidators(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, DelegatorValidatorsMethod, err.Error()) } return method.Outputs.Pack(res.Validators) @@ -199,7 +199,7 @@ func (p Precompile) DelegatorWithdrawAddress( res, err := p.distributionQuerier.DelegatorWithdrawAddress(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, DelegatorWithdrawAddressMethod, err.Error()) } return method.Outputs.Pack(res.WithdrawAddress) @@ -219,7 +219,7 @@ func (p Precompile) CommunityPool( res, err := p.distributionQuerier.CommunityPool(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, CommunityPoolMethod, err.Error()) } out := new(CommunityPoolOutput).FromResponse(res) diff --git a/precompiles/distribution/tx.go b/precompiles/distribution/tx.go index 3dea64f02..df02706dd 100644 --- a/precompiles/distribution/tx.go +++ b/precompiles/distribution/tx.go @@ -1,8 +1,6 @@ package distribution import ( - "fmt" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" @@ -28,6 +26,12 @@ const ( // DepositValidatorRewardsPoolMethod defines the ABI method name for the distribution // DepositValidatorRewardsPool transaction DepositValidatorRewardsPoolMethod = "depositValidatorRewardsPool" + // ClaimRewardsMaxValidatorsQueryMethod is the method label for MaxValidators keeper query. + ClaimRewardsMaxValidatorsQueryMethod = "MaxValidators" + // ClaimRewardsGetDelegatorValidatorsQueryMethod is the method label for GetDelegatorValidators query. + ClaimRewardsGetDelegatorValidatorsQueryMethod = "GetDelegatorValidators" + // ClaimRewardsWithdrawDelegationRewardsMsgMethod is the method label for WithdrawDelegationRewards call. + ClaimRewardsWithdrawDelegationRewardsMsgMethod = "WithdrawDelegationRewards" ) // ClaimRewards claims the rewards accumulated by a delegator from multiple or all validators. @@ -45,40 +49,40 @@ func (p *Precompile) ClaimRewards( maxVals, err := p.stakingKeeper.MaxValidators(ctx) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ClaimRewardsMaxValidatorsQueryMethod, err.Error()) } if maxRetrieve > maxVals { - return nil, fmt.Errorf("maxRetrieve (%d) parameter exceeds the maximum number of validators (%d)", maxRetrieve, maxVals) + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrClaimRewardsMaxRetrieveExceeded, maxRetrieve, maxVals) } msgSender := contract.Caller() if msgSender != delegatorAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), delegatorAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, delegatorAddr) } res, err := p.stakingKeeper.GetDelegatorValidators(ctx, delegatorAddr.Bytes(), maxRetrieve) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ClaimRewardsGetDelegatorValidatorsQueryMethod, err.Error()) } totalCoins := sdk.Coins{} for _, validator := range res.Validators { // Convert the validator operator address into an ValAddress valAddr, err := sdk.ValAddressFromBech32(validator.OperatorAddress) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrInvalidAddress, validator.OperatorAddress) } // Withdraw the rewards for each validator address coins, err := p.distributionKeeper.WithdrawDelegationRewards(ctx, delegatorAddr.Bytes(), valAddr) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, ClaimRewardsWithdrawDelegationRewardsMsgMethod, err.Error()) } totalCoins = totalCoins.Add(coins...) } if err := p.EmitClaimRewardsEvent(ctx, stateDB, delegatorAddr, totalCoins); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, ClaimRewardsMethod, err.Error()) } return method.Outputs.Pack(true) @@ -99,15 +103,15 @@ func (p Precompile) SetWithdrawAddress( msgSender := contract.Caller() if msgSender != delegatorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), delegatorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, delegatorHexAddr) } if _, err = p.distributionMsgServer.SetWithdrawAddress(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, SetWithdrawAddressMethod, err.Error()) } if err = p.EmitSetWithdrawAddressEvent(ctx, stateDB, delegatorHexAddr, msg.WithdrawAddress); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, SetWithdrawAddressMethod, err.Error()) } return method.Outputs.Pack(true) @@ -128,16 +132,16 @@ func (p *Precompile) WithdrawDelegatorReward( msgSender := contract.Caller() if msgSender != delegatorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), delegatorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, delegatorHexAddr) } res, err := p.distributionMsgServer.WithdrawDelegatorReward(ctx, msg) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, WithdrawDelegatorRewardMethod, err.Error()) } if err = p.EmitWithdrawDelegatorRewardEvent(ctx, stateDB, delegatorHexAddr, msg.ValidatorAddress, res.Amount); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, WithdrawDelegatorRewardMethod, err.Error()) } return method.Outputs.Pack(cmn.NewCoinsResponse(res.Amount)) @@ -158,16 +162,16 @@ func (p *Precompile) WithdrawValidatorCommission( msgSender := contract.Caller() if msgSender != validatorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), validatorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, validatorHexAddr) } res, err := p.distributionMsgServer.WithdrawValidatorCommission(ctx, msg) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, WithdrawValidatorCommissionMethod, err.Error()) } if err = p.EmitWithdrawValidatorCommissionEvent(ctx, stateDB, msg.ValidatorAddress, res.Amount); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, WithdrawValidatorCommissionMethod, err.Error()) } return method.Outputs.Pack(cmn.NewCoinsResponse(res.Amount)) @@ -188,16 +192,16 @@ func (p *Precompile) FundCommunityPool( msgSender := contract.Caller() if msgSender != depositorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), depositorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, depositorHexAddr) } _, err = p.distributionMsgServer.FundCommunityPool(ctx, msg) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, FundCommunityPoolMethod, err.Error()) } if err = p.EmitFundCommunityPoolEvent(ctx, stateDB, depositorHexAddr, msg.Amount); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, FundCommunityPoolMethod, err.Error()) } return method.Outputs.Pack(true) @@ -219,16 +223,16 @@ func (p *Precompile) DepositValidatorRewardsPool( msgSender := contract.Caller() if msgSender != depositorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), depositorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, depositorHexAddr) } _, err = p.distributionMsgServer.DepositValidatorRewardsPool(ctx, msg) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, DepositValidatorRewardsPoolMethod, err.Error()) } if err = p.EmitDepositValidatorRewardsPoolEvent(ctx, stateDB, depositorHexAddr, msg.ValidatorAddress, msg.Amount); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, DepositValidatorRewardsPoolMethod, err.Error()) } return method.Outputs.Pack(true) diff --git a/precompiles/distribution/types.go b/precompiles/distribution/types.go index 2323ceafc..5ed6a06c8 100644 --- a/precompiles/distribution/types.go +++ b/precompiles/distribution/types.go @@ -61,17 +61,17 @@ type EventDepositValidatorRewardsPool struct { // parseClaimRewardsArgs parses the arguments for the ClaimRewards method. func parseClaimRewardsArgs(args []interface{}) (common.Address, uint32, error) { if len(args) != 2 { - return common.Address{}, 0, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return common.Address{}, 0, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } delegatorAddress, ok := args[0].(common.Address) if !ok || delegatorAddress == (common.Address{}) { - return common.Address{}, 0, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return common.Address{}, 0, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } maxRetrieve, ok := args[1].(uint32) if !ok { - return common.Address{}, 0, fmt.Errorf(cmn.ErrInvalidType, "maxRetrieve", uint32(0), args[1]) + return common.Address{}, 0, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } return delegatorAddress, maxRetrieve, nil @@ -80,12 +80,12 @@ func parseClaimRewardsArgs(args []interface{}) (common.Address, uint32, error) { // NewMsgSetWithdrawAddress creates a new MsgSetWithdrawAddress instance. func NewMsgSetWithdrawAddress(args []interface{}, addrCdc address.Codec) (*distributiontypes.MsgSetWithdrawAddress, common.Address, error) { if len(args) != 2 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } delegatorAddress, ok := args[0].(common.Address) if !ok || delegatorAddress == (common.Address{}) { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } withdrawerAddress, _ := args[1].(string) @@ -95,13 +95,13 @@ func NewMsgSetWithdrawAddress(args []interface{}, addrCdc address.Codec) (*distr var err error withdrawerAddress, err = sdk.Bech32ifyAddressBytes(sdk.GetConfig().GetBech32AccountAddrPrefix(), common.HexToAddress(withdrawerAddress).Bytes()) if err != nil { - return nil, common.Address{}, err + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } } delAddr, err := addrCdc.BytesToString(delegatorAddress.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &distributiontypes.MsgSetWithdrawAddress{ DelegatorAddress: delAddr, @@ -114,19 +114,22 @@ func NewMsgSetWithdrawAddress(args []interface{}, addrCdc address.Codec) (*distr // NewMsgWithdrawDelegatorReward creates a new MsgWithdrawDelegatorReward instance. func NewMsgWithdrawDelegatorReward(args []interface{}, addrCdc address.Codec) (*distributiontypes.MsgWithdrawDelegatorReward, common.Address, error) { if len(args) != 2 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } delegatorAddress, ok := args[0].(common.Address) if !ok || delegatorAddress == (common.Address{}) { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } validatorAddress, _ := args[1].(string) + if _, err := sdk.ValAddressFromBech32(validatorAddress); err != nil { + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) + } delAddr, err := addrCdc.BytesToString(delegatorAddress.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &distributiontypes.MsgWithdrawDelegatorReward{ DelegatorAddress: delAddr, @@ -139,7 +142,7 @@ func NewMsgWithdrawDelegatorReward(args []interface{}, addrCdc address.Codec) (* // NewMsgWithdrawValidatorCommission creates a new MsgWithdrawValidatorCommission message. func NewMsgWithdrawValidatorCommission(args []interface{}) (*distributiontypes.MsgWithdrawValidatorCommission, common.Address, error) { if len(args) != 1 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } validatorAddress, _ := args[0].(string) @@ -150,7 +153,7 @@ func NewMsgWithdrawValidatorCommission(args []interface{}) (*distributiontypes.M validatorHexAddr, err := utils.HexAddressFromBech32String(msg.ValidatorAddress) if err != nil { - return nil, common.Address{}, err + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } return msg, validatorHexAddr, nil @@ -160,27 +163,27 @@ func NewMsgWithdrawValidatorCommission(args []interface{}) (*distributiontypes.M func NewMsgFundCommunityPool(args []interface{}, addrCdc address.Codec) (*distributiontypes.MsgFundCommunityPool, common.Address, error) { emptyAddr := common.Address{} if len(args) != 2 { - return nil, emptyAddr, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } depositorAddress, ok := args[0].(common.Address) if !ok || depositorAddress == emptyAddr { - return nil, emptyAddr, fmt.Errorf(cmn.ErrInvalidHexAddress, args[0]) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } coins, err := cmn.ToCoins(args[1]) if err != nil { - return nil, emptyAddr, fmt.Errorf(ErrInvalidAmount, "amount arg") + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[1])) } amt, err := cmn.NewSdkCoinsFromCoins(coins) if err != nil { - return nil, emptyAddr, fmt.Errorf(ErrInvalidAmount, "amount arg") + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", err)) } depAddr, err := addrCdc.BytesToString(depositorAddress.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode depositor address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &distributiontypes.MsgFundCommunityPool{ Depositor: depAddr, @@ -193,29 +196,32 @@ func NewMsgFundCommunityPool(args []interface{}, addrCdc address.Codec) (*distri // NewMsgDepositValidatorRewardsPool creates a new MsgDepositValidatorRewardsPool message. func NewMsgDepositValidatorRewardsPool(args []interface{}, addrCdc address.Codec) (*distributiontypes.MsgDepositValidatorRewardsPool, common.Address, error) { if len(args) != 3 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 3, len(args)) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(int64(len(args)))) } depositorAddress, ok := args[0].(common.Address) if !ok || depositorAddress == (common.Address{}) { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidHexAddress, args[0]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } validatorAddress, _ := args[1].(string) + if _, err := sdk.ValAddressFromBech32(validatorAddress); err != nil { + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) + } coins, err := cmn.ToCoins(args[2]) if err != nil { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidAmount, args[2]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[2])) } amount, err := cmn.NewSdkCoinsFromCoins(coins) if err != nil { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidAmount, err.Error()) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", err)) } depAddr, err := addrCdc.BytesToString(depositorAddress.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode depositor address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &distributiontypes.MsgDepositValidatorRewardsPool{ @@ -231,10 +237,13 @@ func NewMsgDepositValidatorRewardsPool(args []interface{}, addrCdc address.Codec // checks on the provided arguments. func NewValidatorDistributionInfoRequest(args []interface{}) (*distributiontypes.QueryValidatorDistributionInfoRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } validatorAddress, _ := args[0].(string) + if _, err := sdk.ValAddressFromBech32(validatorAddress); err != nil { + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) + } return &distributiontypes.QueryValidatorDistributionInfoRequest{ ValidatorAddress: validatorAddress, @@ -245,10 +254,13 @@ func NewValidatorDistributionInfoRequest(args []interface{}) (*distributiontypes // checks on the provided arguments. func NewValidatorOutstandingRewardsRequest(args []interface{}) (*distributiontypes.QueryValidatorOutstandingRewardsRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } validatorAddress, _ := args[0].(string) + if _, err := sdk.ValAddressFromBech32(validatorAddress); err != nil { + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) + } return &distributiontypes.QueryValidatorOutstandingRewardsRequest{ ValidatorAddress: validatorAddress, @@ -259,10 +271,13 @@ func NewValidatorOutstandingRewardsRequest(args []interface{}) (*distributiontyp // checks on the provided arguments. func NewValidatorCommissionRequest(args []interface{}) (*distributiontypes.QueryValidatorCommissionRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } validatorAddress, _ := args[0].(string) + if _, err := sdk.ValAddressFromBech32(validatorAddress); err != nil { + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) + } return &distributiontypes.QueryValidatorCommissionRequest{ ValidatorAddress: validatorAddress, @@ -273,19 +288,19 @@ func NewValidatorCommissionRequest(args []interface{}) (*distributiontypes.Query // checks on the provided arguments. func NewValidatorSlashesRequest(method *abi.Method, args []interface{}) (*distributiontypes.QueryValidatorSlashesRequest, error) { if len(args) != 4 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(int64(len(args)))) } if _, ok := args[1].(uint64); !ok { - return nil, fmt.Errorf(cmn.ErrInvalidType, "startingHeight", uint64(0), args[1]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidHeight, fmt.Sprintf("%v", args[1])) } if _, ok := args[2].(uint64); !ok { - return nil, fmt.Errorf(cmn.ErrInvalidType, "endingHeight", uint64(0), args[2]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidHeight, fmt.Sprintf("%v", args[2])) } var input ValidatorSlashesInput if err := method.Inputs.Copy(&input, args); err != nil { - return nil, fmt.Errorf("error while unpacking args to ValidatorSlashesInput struct: %s", err) + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrDistributionValidatorSlashesUnpackFailed, err.Error()) } return &distributiontypes.QueryValidatorSlashesRequest{ @@ -300,19 +315,22 @@ func NewValidatorSlashesRequest(method *abi.Method, args []interface{}) (*distri // checks on the provided arguments. func NewDelegationRewardsRequest(args []interface{}, addrCdc address.Codec) (*distributiontypes.QueryDelegationRewardsRequest, error) { if len(args) != 2 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } delegatorAddress, ok := args[0].(common.Address) if !ok || delegatorAddress == (common.Address{}) { - return nil, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } validatorAddress, _ := args[1].(string) + if _, err := sdk.ValAddressFromBech32(validatorAddress); err != nil { + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) + } delAddr, err := addrCdc.BytesToString(delegatorAddress.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } return &distributiontypes.QueryDelegationRewardsRequest{ DelegatorAddress: delAddr, @@ -324,17 +342,17 @@ func NewDelegationRewardsRequest(args []interface{}, addrCdc address.Codec) (*di // checks on the provided arguments. func NewDelegationTotalRewardsRequest(args []interface{}, addrCdc address.Codec) (*distributiontypes.QueryDelegationTotalRewardsRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } delegatorAddress, ok := args[0].(common.Address) if !ok || delegatorAddress == (common.Address{}) { - return nil, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } delAddr, err := addrCdc.BytesToString(delegatorAddress.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } return &distributiontypes.QueryDelegationTotalRewardsRequest{ DelegatorAddress: delAddr, @@ -345,17 +363,17 @@ func NewDelegationTotalRewardsRequest(args []interface{}, addrCdc address.Codec) // checks on the provided arguments. func NewDelegatorValidatorsRequest(args []interface{}, addrCdc address.Codec) (*distributiontypes.QueryDelegatorValidatorsRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } delegatorAddress, ok := args[0].(common.Address) if !ok || delegatorAddress == (common.Address{}) { - return nil, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } delAddr, err := addrCdc.BytesToString(delegatorAddress.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } return &distributiontypes.QueryDelegatorValidatorsRequest{ DelegatorAddress: delAddr, @@ -366,17 +384,17 @@ func NewDelegatorValidatorsRequest(args []interface{}, addrCdc address.Codec) (* // checks on the provided arguments. func NewDelegatorWithdrawAddressRequest(args []interface{}, addrCdc address.Codec) (*distributiontypes.QueryDelegatorWithdrawAddressRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } delegatorAddress, ok := args[0].(common.Address) if !ok || delegatorAddress == (common.Address{}) { - return nil, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } delAddr, err := addrCdc.BytesToString(delegatorAddress.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } return &distributiontypes.QueryDelegatorWithdrawAddressRequest{ DelegatorAddress: delAddr, @@ -387,7 +405,7 @@ func NewDelegatorWithdrawAddressRequest(args []interface{}, addrCdc address.Code // checks on the provided arguments. func NewCommunityPoolRequest(args []interface{}) (*distributiontypes.QueryCommunityPoolRequest, error) { if len(args) != 0 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 0, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(0), big.NewInt(int64(len(args)))) } return &distributiontypes.QueryCommunityPoolRequest{}, nil diff --git a/precompiles/distribution/types_test.go b/precompiles/distribution/types_test.go index 1395144fd..2a00dd762 100644 --- a/precompiles/distribution/types_test.go +++ b/precompiles/distribution/types_test.go @@ -1,7 +1,6 @@ package distribution import ( - "fmt" "math/big" "testing" @@ -10,11 +9,12 @@ import ( evmaddress "github.com/cosmos/evm/encoding/address" cmn "github.com/cosmos/evm/precompiles/common" + "github.com/cosmos/evm/precompiles/testutil" sdk "github.com/cosmos/cosmos-sdk/types" ) -const validatorAddr = "cosmosvaloper1qypqxpq9qcrsszg2pvxq6rs0zqg3yyc5a3kaax" +const validatorAddr = "cosmosvaloper1qqqqhe5pnaq5qq39wqkn957aydnrm45s2xz032" func TestNewMsgSetWithdrawAddress(t *testing.T) { addrCodec := evmaddress.NewEvmCodec(sdk.GetConfig().GetBech32AccountAddrPrefix()) @@ -36,7 +36,7 @@ func TestNewMsgSetWithdrawAddress(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegator string wantWithdrawer string }{ @@ -55,28 +55,28 @@ func TestNewMsgSetWithdrawAddress(t *testing.T) { wantWithdrawer: expectedWithdrawerFromHex, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{delegatorAddr, withdrawerBech32, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 3), + name: "too many arguments", + args: []interface{}{delegatorAddr, withdrawerBech32, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(3)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address", withdrawerBech32}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address", withdrawerBech32}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}, withdrawerBech32}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}, withdrawerBech32}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, } @@ -85,8 +85,7 @@ func TestNewMsgSetWithdrawAddress(t *testing.T) { msg, returnAddr, err := NewMsgSetWithdrawAddress(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -111,7 +110,7 @@ func TestNewMsgWithdrawDelegatorReward(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegator string wantValidator string }{ @@ -123,22 +122,22 @@ func TestNewMsgWithdrawDelegatorReward(t *testing.T) { wantValidator: validatorAddr, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address", validatorAddr}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address", validatorAddr}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}, validatorAddr}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}, validatorAddr}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, } @@ -147,8 +146,7 @@ func TestNewMsgWithdrawDelegatorReward(t *testing.T) { msg, returnAddr, err := NewMsgWithdrawDelegatorReward(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -174,7 +172,7 @@ func TestNewMsgFundCommunityPool(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDepositor string }{ { @@ -184,28 +182,28 @@ func TestNewMsgFundCommunityPool(t *testing.T) { wantDepositor: expectedDepositorAddr, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { - name: "invalid depositor type", - args: []interface{}{"not-an-address", validCoins}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidHexAddress, "not-an-address"), + name: "invalid depositor type", + args: []interface{}{"not-an-address", validCoins}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty depositor address", - args: []interface{}{common.Address{}, validCoins}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidHexAddress, common.Address{}), + name: "empty depositor address", + args: []interface{}{common.Address{}, validCoins}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid coins", - args: []interface{}{depositorAddr, "invalid-coins"}, - wantErr: true, - errMsg: fmt.Sprintf(ErrInvalidAmount, "amount arg"), + name: "invalid coins", + args: []interface{}{depositorAddr, "invalid-coins"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, "invalid-coins"), }, } @@ -214,8 +212,7 @@ func TestNewMsgFundCommunityPool(t *testing.T) { msg, returnAddr, err := NewMsgFundCommunityPool(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -241,7 +238,7 @@ func TestNewMsgDepositValidatorRewardsPool(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDepositor string wantValidator string }{ @@ -253,28 +250,28 @@ func TestNewMsgDepositValidatorRewardsPool(t *testing.T) { wantValidator: validatorAddr, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(0)), }, { - name: "invalid depositor type", - args: []interface{}{"not-an-address", validatorAddr, validCoins}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidHexAddress, "not-an-address"), + name: "invalid depositor type", + args: []interface{}{"not-an-address", validatorAddr, validCoins}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty depositor address", - args: []interface{}{common.Address{}, validatorAddr, validCoins}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidHexAddress, common.Address{}), + name: "empty depositor address", + args: []interface{}{common.Address{}, validatorAddr, validCoins}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid coins", - args: []interface{}{depositorAddr, validatorAddr, "invalid-coins"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidAmount, "invalid-coins"), + name: "invalid coins", + args: []interface{}{depositorAddr, validatorAddr, "invalid-coins"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, "invalid-coins"), }, } @@ -283,8 +280,7 @@ func TestNewMsgDepositValidatorRewardsPool(t *testing.T) { msg, returnAddr, err := NewMsgDepositValidatorRewardsPool(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -310,7 +306,7 @@ func TestNewDelegationRewardsRequest(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegator string wantValidator string }{ @@ -322,22 +318,22 @@ func TestNewDelegationRewardsRequest(t *testing.T) { wantValidator: validatorAddr, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address", validatorAddr}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address", validatorAddr}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}, validatorAddr}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}, validatorAddr}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, } @@ -346,8 +342,7 @@ func TestNewDelegationRewardsRequest(t *testing.T) { req, err := NewDelegationRewardsRequest(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, req) } else { require.NoError(t, err) @@ -371,7 +366,7 @@ func TestNewDelegationTotalRewardsRequest(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegator string }{ { @@ -381,22 +376,22 @@ func TestNewDelegationTotalRewardsRequest(t *testing.T) { wantDelegator: expectedDelegatorAddr, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, } @@ -405,8 +400,7 @@ func TestNewDelegationTotalRewardsRequest(t *testing.T) { req, err := NewDelegationTotalRewardsRequest(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, req) } else { require.NoError(t, err) @@ -429,7 +423,7 @@ func TestNewDelegatorValidatorsRequest(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegator string }{ { @@ -439,22 +433,22 @@ func TestNewDelegatorValidatorsRequest(t *testing.T) { wantDelegator: expectedDelegatorAddr, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, } @@ -463,8 +457,7 @@ func TestNewDelegatorValidatorsRequest(t *testing.T) { req, err := NewDelegatorValidatorsRequest(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, req) } else { require.NoError(t, err) @@ -487,7 +480,7 @@ func TestNewDelegatorWithdrawAddressRequest(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegator string }{ { @@ -497,22 +490,22 @@ func TestNewDelegatorWithdrawAddressRequest(t *testing.T) { wantDelegator: expectedDelegatorAddr, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, } @@ -521,8 +514,7 @@ func TestNewDelegatorWithdrawAddressRequest(t *testing.T) { req, err := NewDelegatorWithdrawAddressRequest(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, req) } else { require.NoError(t, err) diff --git a/precompiles/erc20/ERC20I.sol b/precompiles/erc20/ERC20I.sol new file mode 100644 index 000000000..a91f34ebc --- /dev/null +++ b/precompiles/erc20/ERC20I.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; + +import "../common/Types.sol"; + +/// @dev Cosmos ERC-20 precompile: OpenZeppelin IERC20 (via IERC20Metadata) and metadata, +/// ERC-6093 IERC20Errors, shared IPrecompile errors, and native-value rejection. +interface ERC20I is IERC20Metadata, IERC20Errors, IPrecompile { + error ERC20CannotReceiveFunds(uint256 value); +} diff --git a/precompiles/erc20/IERC20.sol b/precompiles/erc20/IERC20.sol deleted file mode 100644 index 66c4e4d88..000000000 --- a/precompiles/erc20/IERC20.sol +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); - - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `to`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address to, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `from` to `to` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address from, address to, uint256 amount) external returns (bool); -} diff --git a/precompiles/erc20/IERC20Metadata.sol b/precompiles/erc20/IERC20Metadata.sol deleted file mode 100644 index 982bc39eb..000000000 --- a/precompiles/erc20/IERC20Metadata.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) - -pragma solidity ^0.8.0; - -import "./IERC20.sol"; - -/** - * @dev Interface for the optional metadata functions from the ERC20 standard. - * - * _Available since v4.1._ - */ -interface IERC20Metadata is IERC20 { - /** - * @dev Returns the name of the token. - */ - function name() external view returns (string memory); - - /** - * @dev Returns the symbol of the token. - */ - function symbol() external view returns (string memory); - - /** - * @dev Returns the decimals places of the token. - */ - function decimals() external view returns (uint8); -} diff --git a/precompiles/erc20/README.md b/precompiles/erc20/README.md index 5b9870087..b30e3baf4 100644 --- a/precompiles/erc20/README.md +++ b/precompiles/erc20/README.md @@ -5,9 +5,12 @@ token interface within the EVM. This allows smart contracts to interact with nat ## Interface -The precompile implements the standard ERC20 interface with additional metadata support: +The on-chain ABI is the `ERC20I` interface in `ERC20I.sol`. It extends +[OpenZeppelin `IERC20Metadata`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/IERC20Metadata.sol) +(which includes `IERC20`), [`IERC20Errors`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/interfaces/draft-IERC6093.sol), +shared `IPrecompile` errors (`../common/Types.sol`), and `ERC20CannotReceiveFunds`. -### IERC20 Methods +### ERC20 (via OpenZeppelin IERC20) ```solidity // Query Methods @@ -16,12 +19,12 @@ function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); // Transaction Methods -function transfer(address to, uint256 amount) external returns (bool); -function approve(address spender, uint256 amount) external returns (bool); -function transferFrom(address from, address to, uint256 amount) external returns (bool); +function transfer(address to, uint256 value) external returns (bool); +function approve(address spender, uint256 value) external returns (bool); +function transferFrom(address from, address to, uint256 value) external returns (bool); ``` -### IERC20Metadata Methods +### Metadata (via OpenZeppelin IERC20Metadata) ```solidity function name() external view returns (string memory); diff --git a/precompiles/erc20/abi.json b/precompiles/erc20/abi.json index 177ac839e..2d5f91a0a 100644 --- a/precompiles/erc20/abi.json +++ b/precompiles/erc20/abi.json @@ -1,4 +1,263 @@ [ + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ABISetupFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "ERC20CannotReceiveFunds", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "eventKind", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EventEmitFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "bad", + "type": "string" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "amount", + "type": "string" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "height", + "type": "string" + } + ], + "name": "InvalidHeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + } + ], + "name": "InvalidNumberOfArgs", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "pubkey", + "type": "string" + } + ], + "name": "InvalidPubkey", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPubkeySize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msgMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "MsgServerFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "queryMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "QueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + } + ], + "name": "RequesterIsNotMsgSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "methodName", + "type": "string" + } + ], + "name": "UnknownMethod", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -82,7 +341,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -177,7 +436,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -206,7 +465,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], diff --git a/precompiles/erc20/approve.go b/precompiles/erc20/approve.go index 7c061b11b..9b9be5069 100644 --- a/precompiles/erc20/approve.go +++ b/precompiles/erc20/approve.go @@ -8,9 +8,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - sdkerrors "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" + cmn "github.com/cosmos/evm/precompiles/common" + sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -38,24 +39,22 @@ func (p Precompile) Approve( owner := contract.Caller() - // TODO: owner should be the owner of the contract allowance, err := p.erc20Keeper.GetAllowance(ctx, p.Address(), owner, spender) if err != nil { - return nil, sdkerrors.Wrap(err, fmt.Sprintf(ErrNoAllowanceForToken, p.tokenPair.Denom)) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ApproveMethod, + fmt.Sprintf("%s: %v", fmt.Sprintf(ErrNoAllowanceForToken, p.tokenPair.Denom), err)) } switch { case allowance.Sign() == 0 && amount != nil && amount.Sign() < 0: - // case 1: no allowance, amount 0 or negative -> error - err = ErrNegativeAmount + err = cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrInvalidAmount, "cannot approve negative values") case allowance.Sign() == 0 && amount != nil && amount.Sign() > 0: - // case 2: no allowance, amount positive -> create a new allowance err = p.setAllowance(ctx, owner, spender, amount) case allowance.Sign() > 0 && amount != nil && amount.Sign() <= 0: - // case 3: allowance exists, amount 0 or negative -> remove from spend limit and delete allowance if no spend limit left - err = p.erc20Keeper.DeleteAllowance(ctx, p.Address(), owner, spender) + if derr := p.erc20Keeper.DeleteAllowance(ctx, p.Address(), owner, spender); derr != nil { + err = cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ApproveMethod, derr.Error()) + } case allowance.Sign() > 0 && amount != nil && amount.Sign() > 0: - // case 4: allowance exists, amount positive -> update allowance err = p.setAllowance(ctx, owner, spender, amount) } @@ -64,20 +63,23 @@ func (p Precompile) Approve( } if err := p.EmitApprovalEvent(ctx, stateDB, owner, spender, amount); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, ApproveMethod, err.Error()) } return method.Outputs.Pack(true) } -func (p Precompile) setAllowance( +func (p *Precompile) setAllowance( ctx sdk.Context, owner, spender common.Address, allowance *big.Int, ) error { if allowance.BitLen() > sdkmath.MaxBitLen { - return fmt.Errorf(ErrIntegerOverflow, allowance) + return cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf(ErrIntegerOverflow, allowance)) } - return p.erc20Keeper.SetAllowance(ctx, p.Address(), owner, spender, allowance) + if err := p.erc20Keeper.SetAllowance(ctx, p.Address(), owner, spender, allowance); err != nil { + return cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ApproveMethod, err.Error()) + } + return nil } diff --git a/precompiles/erc20/erc20.go b/precompiles/erc20/erc20.go index 087a6d87e..ff7fd044c 100644 --- a/precompiles/erc20/erc20.go +++ b/precompiles/erc20/erc20.go @@ -2,7 +2,6 @@ package erc20 import ( "bytes" - "fmt" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" @@ -144,7 +143,7 @@ func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Co // them.This check is a safety measure because currently funds cannot be // received due to the lack of a fallback handler. if value := contract.Value(); value.Sign() == 1 { - return nil, fmt.Errorf(ErrCannotReceiveFunds, contract.Value().String()) + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrERC20CannotReceiveFunds, value) } method, args, err := cmn.SetupABI(p.ABI, contract, readOnly, p.IsTransaction) @@ -197,7 +196,7 @@ func (p *Precompile) HandleMethod( case AllowanceMethod: bz, err = p.Allowance(ctx, contract, stateDB, method, args) default: - return nil, fmt.Errorf(cmn.ErrUnknownMethod, method.Name) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrUnknownMethod, method.Name) } return bz, err diff --git a/precompiles/erc20/errors.go b/precompiles/erc20/errors.go index 77f90d882..fcad62309 100644 --- a/precompiles/erc20/errors.go +++ b/precompiles/erc20/errors.go @@ -1,64 +1,18 @@ package erc20 -import ( - "errors" - "strings" - - "github.com/ethereum/go-ethereum/core/vm" - - "github.com/cosmos/evm/ibc" - cmn "github.com/cosmos/evm/precompiles/common" -) - // Errors that have formatted information are defined here as a string. const ( - ErrIntegerOverflow = "amount %s causes integer overflow" - ErrInvalidOwner = "invalid from address: %s" - ErrInvalidReceiver = "invalid to address: %s" - ErrNoAllowanceForToken = "allowance for token %s does not exist" - ErrSubtractMoreThanAllowance = "subtracted value cannot be greater than existing allowance for denom %s: %s > %s" - ErrCannotReceiveFunds = "cannot receive funds, received: %s" + ErrIntegerOverflow = "amount %s causes integer overflow" + ErrNoAllowanceForToken = "allowance for token %s does not exist" ) -var ( - // Precompile errors - ErrDecreaseNonPositiveValue = errors.New("cannot decrease allowance with non-positive values") - ErrIncreaseNonPositiveValue = errors.New("cannot increase allowance with non-positive values") - ErrNegativeAmount = errors.New("cannot approve negative values") - ErrSpenderIsOwner = errors.New("spender cannot be the owner") - - // ERC20 errors - ErrDecreasedAllowanceBelowZero = errors.New("ERC20: decreased allowance below zero") - ErrInsufficientAllowance = errors.New("ERC20: insufficient allowance") - ErrTransferAmountExceedsBalance = errors.New("ERC20: transfer amount exceeds balance") +// Solidity custom error names from ERC20I (OpenZeppelin IERC20Errors + IPrecompile + precompile-only). +const ( + SolidityErrERC20InsufficientBalance = "ERC20InsufficientBalance" + SolidityErrERC20InsufficientAllowance = "ERC20InsufficientAllowance" + SolidityErrERC20InvalidSender = "ERC20InvalidSender" + SolidityErrERC20InvalidReceiver = "ERC20InvalidReceiver" + SolidityErrERC20InvalidApprover = "ERC20InvalidApprover" + SolidityErrERC20InvalidSpender = "ERC20InvalidSpender" + SolidityErrERC20CannotReceiveFunds = "ERC20CannotReceiveFunds" ) - -// ConvertErrToERC20Error is a helper function which maps errors raised by the Cosmos SDK stack -// to the corresponding errors which are raised by an ERC20 contract. -// -// TODO: Create the full RevertError types instead of just the standard error type. -// -// TODO: Return ERC-6093 compliant errors. -func ConvertErrToERC20Error(err error) error { - switch { - case strings.Contains(err.Error(), "spendable balance"): - return ErrTransferAmountExceedsBalance - case strings.Contains(err.Error(), "requested amount is more than spend limit"): - return ErrInsufficientAllowance - case strings.Contains(err.Error(), "subtracted value cannot be greater than existing allowance"): - return ErrDecreasedAllowanceBelowZero - case strings.Contains(err.Error(), cmn.ErrIntegerOverflow): - return vm.ErrExecutionReverted - case errors.Is(err, ibc.ErrNoIBCVoucherDenom) || - errors.Is(err, ibc.ErrDenomNotFound) || - strings.Contains(err.Error(), "invalid base denomination") || - strings.Contains(err.Error(), "display denomination not found") || - strings.Contains(err.Error(), "invalid decimals"): - // NOTE: These are the cases when trying to query metadata of a contract, which has no metadata available. - // The ERC20 contract raises an "execution reverted" error, without any further information here, which we - // reproduce (even though it's less verbose than the actual error). - return vm.ErrExecutionReverted - default: - return err - } -} diff --git a/precompiles/erc20/msgsrv.go b/precompiles/erc20/msgsrv.go index ed60ab1f2..26c005a58 100644 --- a/precompiles/erc20/msgsrv.go +++ b/precompiles/erc20/msgsrv.go @@ -28,14 +28,12 @@ func (m MsgServer) Send(goCtx context.Context, msg *banktypes.MsgSend) error { case bankkeeper.BaseKeeper: msgSrv := bankkeeper.NewMsgServerImpl(keeper) if _, err := msgSrv.Send(goCtx, msg); err != nil { - // This should return an error to avoid the contract from being executed and an event being emitted - return ConvertErrToERC20Error(err) + return err } case *bankkeeper.BaseKeeper: msgSrv := bankkeeper.NewMsgServerImpl(keeper) if _, err := msgSrv.Send(goCtx, msg); err != nil { - // This should return an error to avoid the contract from being executed and an event being emitted - return ConvertErrToERC20Error(err) + return err } default: return sdkerrors.ErrInvalidRequest.Wrapf("invalid keeper type: %T", m.BankKeeper) diff --git a/precompiles/erc20/query.go b/precompiles/erc20/query.go index e0c7b72fb..2e87e0d43 100644 --- a/precompiles/erc20/query.go +++ b/precompiles/erc20/query.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/cosmos/evm/ibc" + cmn "github.com/cosmos/evm/precompiles/common" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -52,7 +53,7 @@ func (p Precompile) Name( baseDenom, err := p.getBaseDenomFromIBCVoucher(ctx, p.tokenPair.Denom) if err != nil { - return nil, ConvertErrToERC20Error(err) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, NameMethod, err.Error()) } name := strings.ToUpper(string(baseDenom[1])) + baseDenom[2:] @@ -76,7 +77,7 @@ func (p Precompile) Symbol( baseDenom, err := p.getBaseDenomFromIBCVoucher(ctx, p.tokenPair.Denom) if err != nil { - return nil, ConvertErrToERC20Error(err) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, SymbolMethod, err.Error()) } symbol := strings.ToUpper(baseDenom[1:]) @@ -97,13 +98,13 @@ func (p Precompile) Decimals( if !found { denom, err := ibc.GetDenom(p.transferKeeper, ctx, p.tokenPair.Denom) if err != nil { - return nil, ConvertErrToERC20Error(err) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, DecimalsMethod, err.Error()) } // we assume the decimal from the first character of the denomination decimals, err := ibc.DeriveDecimalsFromDenom(denom.Base) if err != nil { - return nil, ConvertErrToERC20Error(err) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, DecimalsMethod, err.Error()) } return method.Outputs.Pack(decimals) } @@ -128,14 +129,14 @@ func (p Precompile) Decimals( } if !displayFound { - return nil, ConvertErrToERC20Error(fmt.Errorf( + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, DecimalsMethod, fmt.Sprintf( "display denomination not found for denom: %q", p.tokenPair.Denom, )) } if decimals > math.MaxUint8 { - return nil, ConvertErrToERC20Error(fmt.Errorf( + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf( "uint8 overflow: invalid decimals: %d", decimals, )) diff --git a/precompiles/erc20/testdata/ERC20NoMetadata.json b/precompiles/erc20/testdata/ERC20NoMetadata.json index ad2690562..8d352b5e2 100644 --- a/precompiles/erc20/testdata/ERC20NoMetadata.json +++ b/precompiles/erc20/testdata/ERC20NoMetadata.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "ERC20NoMetadata", "sourceName": "solidity/precompiles/erc20/testdata/ERC20NoMetadata.sol", "abi": [ @@ -240,8 +240,11 @@ "type": "function" } ], - "bytecode": "0x6080806040523461001657610617908161001c8239f35b600080fdfe604060808152600436101561001357600080fd5b600090813560e01c8063095ea7b31461031757806318160ddd146102f957806323b872dd1461023557806339509351146101ce57806370a0823114610198578063a457c2d7146100f2578063a9059cbb146100c25763dd62ed3e1461007757600080fd5b346100be57806003193601126100be5780602092610093610340565b61009b61035b565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b5080fd5b50346100be57806003193601126100be576020906100eb6100e1610340565b6024359033610371565b5160018152f35b50346100be57806003193601126100be5761010b610340565b338352600160209081528284206001600160a01b0383168552905291819020546024359081811061014657926100eb916020940390336104df565b825162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b50346100be5760203660031901126100be5760209181906001600160a01b036101bf610340565b16815280845220549051908152f35b50346100be57806003193601126100be576101e7610340565b338352600160209081528284206001600160a01b038316855290528183205460243581019390841061022157506020926100eb91336104df565b634e487b7160e01b81526011600452602490fd5b50346100be5760603660031901126100be5761024f610340565b61025761035b565b90826044359460018060a01b0383168152600160205281812033825260205220546000198103610290575b50926100eb91602094610371565b8481106102b5579184916102ac6020966100eb950333836104df565b91945091610282565b835162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b50346100be57816003193601126100be576020906002549051908152f35b50346100be57806003193601126100be576020906100eb610336610340565b60243590336104df565b600435906001600160a01b038216820361035657565b600080fd5b602435906001600160a01b038216820361035657565b6001600160a01b0390811691821561048c571691821561043b576000828152806020526040812054918083106103e757604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6001600160a01b0390811691821561059057169182156105405760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fdfea264697066735822122019e2252c10fb32490e1f1f36e7f8b4ff219dd144595dffe567b32e2b33d17d3964736f6c63430008140033", - "deployedBytecode": "0x604060808152600436101561001357600080fd5b600090813560e01c8063095ea7b31461031757806318160ddd146102f957806323b872dd1461023557806339509351146101ce57806370a0823114610198578063a457c2d7146100f2578063a9059cbb146100c25763dd62ed3e1461007757600080fd5b346100be57806003193601126100be5780602092610093610340565b61009b61035b565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b5080fd5b50346100be57806003193601126100be576020906100eb6100e1610340565b6024359033610371565b5160018152f35b50346100be57806003193601126100be5761010b610340565b338352600160209081528284206001600160a01b0383168552905291819020546024359081811061014657926100eb916020940390336104df565b825162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b50346100be5760203660031901126100be5760209181906001600160a01b036101bf610340565b16815280845220549051908152f35b50346100be57806003193601126100be576101e7610340565b338352600160209081528284206001600160a01b038316855290528183205460243581019390841061022157506020926100eb91336104df565b634e487b7160e01b81526011600452602490fd5b50346100be5760603660031901126100be5761024f610340565b61025761035b565b90826044359460018060a01b0383168152600160205281812033825260205220546000198103610290575b50926100eb91602094610371565b8481106102b5579184916102ac6020966100eb950333836104df565b91945091610282565b835162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b50346100be57816003193601126100be576020906002549051908152f35b50346100be57806003193601126100be576020906100eb610336610340565b60243590336104df565b600435906001600160a01b038216820361035657565b600080fd5b602435906001600160a01b038216820361035657565b6001600160a01b0390811691821561048c571691821561043b576000828152806020526040812054918083106103e757604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6001600160a01b0390811691821561059057169182156105405760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fdfea264697066735822122019e2252c10fb32490e1f1f36e7f8b4ff219dd144595dffe567b32e2b33d17d3964736f6c63430008140033", + "bytecode": "0x6080806040523460155761060e908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c8063095ea7b31461030c57806318160ddd146102ef57806323b872dd1461023257806339509351146101d057806370a0823114610199578063a457c2d7146100f6578063a9059cbb146100c55763dd62ed3e14610071575f80fd5b346100c15760403660031901126100c15761008a610332565b610092610348565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b346100c15760403660031901126100c1576100eb6100e1610332565b6024359033610462565b602060405160018152f35b346100c15760403660031901126100c15761010f610332565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f205491808310610146576100eb9203903361035e565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b346100c15760203660031901126100c1576001600160a01b036101ba610332565b165f525f602052602060405f2054604051908152f35b346100c15760403660031901126100c1576101e9610332565b335f52600160205260405f2060018060a01b0382165f5260205260405f2054602435810180911161021e576100eb913361035e565b634e487b7160e01b5f52601160045260245ffd5b346100c15760603660031901126100c15761024b610332565b610253610348565b6001600160a01b0382165f90815260016020818152604080842033855290915290912054926044359291840161028e575b6100eb9350610462565b8284106102aa576102a5836100eb9503338361035e565b610284565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b346100c1575f3660031901126100c1576020600254604051908152f35b346100c15760403660031901126100c1576100eb610328610332565b602435903361035e565b600435906001600160a01b03821682036100c157565b602435906001600160a01b03821682036100c157565b6001600160a01b0316908115610411576001600160a01b03169182156103c15760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b0316908115610585576001600160a01b031691821561053457815f525f60205260405f20548181106104e057817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fdfea264697066735822122011546e4acd2ec8a4d9737c7d7d9d1bb2cab3ffc2e12fa3b687377d5b04c6af9e64736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c8063095ea7b31461030c57806318160ddd146102ef57806323b872dd1461023257806339509351146101d057806370a0823114610199578063a457c2d7146100f6578063a9059cbb146100c55763dd62ed3e14610071575f80fd5b346100c15760403660031901126100c15761008a610332565b610092610348565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b346100c15760403660031901126100c1576100eb6100e1610332565b6024359033610462565b602060405160018152f35b346100c15760403660031901126100c15761010f610332565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f205491808310610146576100eb9203903361035e565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b346100c15760203660031901126100c1576001600160a01b036101ba610332565b165f525f602052602060405f2054604051908152f35b346100c15760403660031901126100c1576101e9610332565b335f52600160205260405f2060018060a01b0382165f5260205260405f2054602435810180911161021e576100eb913361035e565b634e487b7160e01b5f52601160045260245ffd5b346100c15760603660031901126100c15761024b610332565b610253610348565b6001600160a01b0382165f90815260016020818152604080842033855290915290912054926044359291840161028e575b6100eb9350610462565b8284106102aa576102a5836100eb9503338361035e565b610284565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b346100c1575f3660031901126100c1576020600254604051908152f35b346100c15760403660031901126100c1576100eb610328610332565b602435903361035e565b600435906001600160a01b03821682036100c157565b602435906001600160a01b03821682036100c157565b6001600160a01b0316908115610411576001600160a01b03169182156103c15760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b0316908115610585576001600160a01b031691821561053457815f525f60205260405f20548181106104e057817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fdfea264697066735822122011546e4acd2ec8a4d9737c7d7d9d1bb2cab3ffc2e12fa3b687377d5b04c6af9e64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/erc20/testdata/ERC20NoMetadata.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/erc20/testdata/ERC20TestCaller.json b/precompiles/erc20/testdata/ERC20TestCaller.json index d4c6cd0e1..8f4eedc31 100644 --- a/precompiles/erc20/testdata/ERC20TestCaller.json +++ b/precompiles/erc20/testdata/ERC20TestCaller.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "ERC20TestCaller", "sourceName": "solidity/precompiles/erc20/testdata/ERC20TestCaller.sol", "abi": [ @@ -182,7 +182,7 @@ "name": "token", "outputs": [ { - "internalType": "contract IERC20Metadata", + "internalType": "contract ERC20I", "name": "", "type": "address" } @@ -314,8 +314,11 @@ "type": "function" } ], - "bytecode": "0x60803461007757601f610bf638819003918201601f19168301916001600160401b0383118484101761007c5780849260209460405283398101031261007757516001600160a01b0381169081900361007757600080546001600160a01b031916919091178155600155604051610b6390816100938239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9184836306fdde03146108975750508163095ea7b31461083b57816318160ddd146107ef57816323b872dd14610776578163268d070a14610639578163313ce5671461059d57816361bc221a1461057e5781636bc7b7cd1461046657816370a08231146103c857816395d89b411461034d578163a9059cbb146102b5578163d0fedf551461019e578163dd62ed3e146100eb575063fc0c546a146100c157600080fd5b346100e757816003193601126100e757905490516001600160a01b039091168152602090f35b5080fd5b919050346101885780600319360112610188576020610108610950565b604461011261096b565b86548551636eb1769f60e11b81526001600160a01b0394851697810197909752908316602487015285928391165afa918215610194578392610159575b6020838351908152f35b9091506020813d821161018c575b8161017460209383610981565b81010312610188576020925051903861014f565b8280fd5b3d9150610167565b81513d85823e3d90fd5b83915060803660031901126100e7576101b5610950565b9060443580151581036102b1576064359283151584036102ad5790602061022286936101e2600154610a4f565b6001558454895163a9059cbb60e01b81526001600160a01b03928316888201908152602435602082015290998a9493909216928492918391604090910190565b03925af19485156102a3578295610273575b5061025b576001549182156102605750506000190160015561025b57602091519015158152f35b610a74565b634e487b7160e01b825260119052602490fd5b61029591955060203d811161029c575b61028d8183610981565b8101906109b9565b9386610234565b503d610283565b86513d84823e3d90fd5b8480fd5b8380fd5b919050346101885780600319360112610188576020610311926102d6610950565b8554845163a9059cbb60e01b81526001600160a01b039283169381019384526024356020850152958693919092169183918891839160400190565b03925af1918215610194576020939261032e575b50519015158152f35b610346919250833d811161029c5761028d8183610981565b9038610325565b91905034610188578260031936011261018857825481516395d89b4160e01b815292849184919082906001600160a01b03165afa918215610194578361039f94936103a3575b50505191829182610924565b0390f35b6103c09293503d8091833e6103b88183610981565b8101906109ed565b903880610393565b8383346100e7576020928360031936011261018857836103e6610950565b845484516370a0823160e01b81526001600160a01b039283169481019490945283916024918391165afa92831561045b578093610426575b505051908152f35b909192508382813d8311610454575b61043f8183610981565b8101031261045157505190838061041e565b80fd5b503d610435565b8251903d90823e3d90fd5b828460c03660031901126104515761047c610950565b926084359384151585036101885760a4359182151583036102b1576001600160a01b03828116969091906104c1868080806044358d5af16104bb610aa7565b50610ad7565b610545578454865163a9059cbb60e01b81526001600160a01b03949094169184019182526024356020808401919091529284928390036040019183918891165af1908115610574579061051a9184916105565750610ad7565b61054557808080602095606435905af190610533610aa7565b5061053d82610ad7565b519015158152f35b610550600154610a4f565b50610a74565b61056e915060203d811161029c5761028d8183610981565b866104bb565b84513d85823e3d90fd5b5050346100e757816003193601126100e7576020906001549051908152f35b8284346104515780600319360112610451578054825163313ce56760e01b81529360209185919082906001600160a01b03165afa92831561062d5781936105ec575b60208460ff855191168152f35b9092506020813d8211610625575b8161060760209383610981565b8101031261018857519160ff83168303610451575060ff60206105df565b3d91506105fa565b509051903d90823e3d90fd5b919050606036600319011261018857610650610950565b60019261065d8454610a4f565b84558454835163a9059cbb60e01b81526001600160a01b038481168483019081526024356020828101919091529691939192918791839186169082908c90829060400103925af190811561076c57889161074f575b501561071a57519263d0fedf5560e01b845216908201526044356024820152826044820152826064820152818160848187305af16106fc575b50506106f78154610a4f565b905580f35b8161071292903d1061029c5761028d8183610981565b5038806106eb565b5162461bcd60e51b8152808301859052601060248201526f3330b4b6103a37903a3930b739b332b960811b6044820152606490fd5b6107669150863d881161029c5761028d8183610981565b386106b2565b82513d8a823e3d90fd5b91905034610188576060366003190112610188576020610794610950565b606461079e61096b565b865485516323b872dd60e01b81526001600160a01b039485169781019790975290831660248701526044803590870152859283918891165af1918215610194576020939261032e5750519015158152f35b91905034610188578260031936011261018857825481516318160ddd60e01b81529260209184919082906001600160a01b03165afa918215610194578392610159576020838351908152f35b9190503461018857806003193601126101885760206103119261085c610950565b8554845163095ea7b360e01b81526001600160a01b039283169381019384526024356020850152958693919092169183918891839160400190565b91828591346100e757816003193601126100e75781546306fdde0360e01b855284919082906001600160a01b03165afa918215610194578361039f94936108e45750505191829182610924565b6108f99293503d8091833e6103b88183610981565b908380610393565b60005b8381106109145750506000910152565b8181015183820152602001610904565b604091602082526109448151809281602086015260208686019101610901565b601f01601f1916010190565b600435906001600160a01b038216820361096657565b600080fd5b602435906001600160a01b038216820361096657565b90601f8019910116810190811067ffffffffffffffff8211176109a357604052565b634e487b7160e01b600052604160045260246000fd5b90816020910312610966575180151581036109665790565b67ffffffffffffffff81116109a357601f01601f191660200190565b6020818303126109665780519067ffffffffffffffff8211610966570181601f82011215610966578051610a20816109d1565b92610a2e6040519485610981565b8184526020828401011161096657610a4c9160208085019101610901565b90565b6000198114610a5e5760010190565b634e487b7160e01b600052601160045260246000fd5b60405162461bcd60e51b815260206004820152600b60248201526a726576657274206865726560a81b6044820152606490fd5b3d15610ad2573d90610ab8826109d1565b91610ac66040519384610981565b82523d6000602084013e565b606090565b15610ade57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fdfea264697066735822122062ba743dd9ada86a55113a52bb15264a99fef9ed2643c9db57b47edded3c20b664736f6c63430008140033", - "deployedBytecode": "0x608060408181526004918236101561001657600080fd5b600092833560e01c9184836306fdde03146108975750508163095ea7b31461083b57816318160ddd146107ef57816323b872dd14610776578163268d070a14610639578163313ce5671461059d57816361bc221a1461057e5781636bc7b7cd1461046657816370a08231146103c857816395d89b411461034d578163a9059cbb146102b5578163d0fedf551461019e578163dd62ed3e146100eb575063fc0c546a146100c157600080fd5b346100e757816003193601126100e757905490516001600160a01b039091168152602090f35b5080fd5b919050346101885780600319360112610188576020610108610950565b604461011261096b565b86548551636eb1769f60e11b81526001600160a01b0394851697810197909752908316602487015285928391165afa918215610194578392610159575b6020838351908152f35b9091506020813d821161018c575b8161017460209383610981565b81010312610188576020925051903861014f565b8280fd5b3d9150610167565b81513d85823e3d90fd5b83915060803660031901126100e7576101b5610950565b9060443580151581036102b1576064359283151584036102ad5790602061022286936101e2600154610a4f565b6001558454895163a9059cbb60e01b81526001600160a01b03928316888201908152602435602082015290998a9493909216928492918391604090910190565b03925af19485156102a3578295610273575b5061025b576001549182156102605750506000190160015561025b57602091519015158152f35b610a74565b634e487b7160e01b825260119052602490fd5b61029591955060203d811161029c575b61028d8183610981565b8101906109b9565b9386610234565b503d610283565b86513d84823e3d90fd5b8480fd5b8380fd5b919050346101885780600319360112610188576020610311926102d6610950565b8554845163a9059cbb60e01b81526001600160a01b039283169381019384526024356020850152958693919092169183918891839160400190565b03925af1918215610194576020939261032e575b50519015158152f35b610346919250833d811161029c5761028d8183610981565b9038610325565b91905034610188578260031936011261018857825481516395d89b4160e01b815292849184919082906001600160a01b03165afa918215610194578361039f94936103a3575b50505191829182610924565b0390f35b6103c09293503d8091833e6103b88183610981565b8101906109ed565b903880610393565b8383346100e7576020928360031936011261018857836103e6610950565b845484516370a0823160e01b81526001600160a01b039283169481019490945283916024918391165afa92831561045b578093610426575b505051908152f35b909192508382813d8311610454575b61043f8183610981565b8101031261045157505190838061041e565b80fd5b503d610435565b8251903d90823e3d90fd5b828460c03660031901126104515761047c610950565b926084359384151585036101885760a4359182151583036102b1576001600160a01b03828116969091906104c1868080806044358d5af16104bb610aa7565b50610ad7565b610545578454865163a9059cbb60e01b81526001600160a01b03949094169184019182526024356020808401919091529284928390036040019183918891165af1908115610574579061051a9184916105565750610ad7565b61054557808080602095606435905af190610533610aa7565b5061053d82610ad7565b519015158152f35b610550600154610a4f565b50610a74565b61056e915060203d811161029c5761028d8183610981565b866104bb565b84513d85823e3d90fd5b5050346100e757816003193601126100e7576020906001549051908152f35b8284346104515780600319360112610451578054825163313ce56760e01b81529360209185919082906001600160a01b03165afa92831561062d5781936105ec575b60208460ff855191168152f35b9092506020813d8211610625575b8161060760209383610981565b8101031261018857519160ff83168303610451575060ff60206105df565b3d91506105fa565b509051903d90823e3d90fd5b919050606036600319011261018857610650610950565b60019261065d8454610a4f565b84558454835163a9059cbb60e01b81526001600160a01b038481168483019081526024356020828101919091529691939192918791839186169082908c90829060400103925af190811561076c57889161074f575b501561071a57519263d0fedf5560e01b845216908201526044356024820152826044820152826064820152818160848187305af16106fc575b50506106f78154610a4f565b905580f35b8161071292903d1061029c5761028d8183610981565b5038806106eb565b5162461bcd60e51b8152808301859052601060248201526f3330b4b6103a37903a3930b739b332b960811b6044820152606490fd5b6107669150863d881161029c5761028d8183610981565b386106b2565b82513d8a823e3d90fd5b91905034610188576060366003190112610188576020610794610950565b606461079e61096b565b865485516323b872dd60e01b81526001600160a01b039485169781019790975290831660248701526044803590870152859283918891165af1918215610194576020939261032e5750519015158152f35b91905034610188578260031936011261018857825481516318160ddd60e01b81529260209184919082906001600160a01b03165afa918215610194578392610159576020838351908152f35b9190503461018857806003193601126101885760206103119261085c610950565b8554845163095ea7b360e01b81526001600160a01b039283169381019384526024356020850152958693919092169183918891839160400190565b91828591346100e757816003193601126100e75781546306fdde0360e01b855284919082906001600160a01b03165afa918215610194578361039f94936108e45750505191829182610924565b6108f99293503d8091833e6103b88183610981565b908380610393565b60005b8381106109145750506000910152565b8181015183820152602001610904565b604091602082526109448151809281602086015260208686019101610901565b601f01601f1916010190565b600435906001600160a01b038216820361096657565b600080fd5b602435906001600160a01b038216820361096657565b90601f8019910116810190811067ffffffffffffffff8211176109a357604052565b634e487b7160e01b600052604160045260246000fd5b90816020910312610966575180151581036109665790565b67ffffffffffffffff81116109a357601f01601f191660200190565b6020818303126109665780519067ffffffffffffffff8211610966570181601f82011215610966578051610a20816109d1565b92610a2e6040519485610981565b8184526020828401011161096657610a4c9160208085019101610901565b90565b6000198114610a5e5760010190565b634e487b7160e01b600052601160045260246000fd5b60405162461bcd60e51b815260206004820152600b60248201526a726576657274206865726560a81b6044820152606490fd5b3d15610ad2573d90610ab8826109d1565b91610ac66040519384610981565b82523d6000602084013e565b606090565b15610ade57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fdfea264697066735822122062ba743dd9ada86a55113a52bb15264a99fef9ed2643c9db57b47edded3c20b664736f6c63430008140033", + "bytecode": "0x608034607257601f610ae938819003918201601f19168301916001600160401b03831184841017607657808492602094604052833981010312607257516001600160a01b038116908190036072575f80546001600160a01b031916919091178155600155604051610a5e908161008b8239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde03146107f757508063095ea7b31461079e57806318160ddd1461075257806323b872dd146106d7578063268d070a146105a2578063313ce5671461051557806361bc221a146104f85780636bc7b7cd146103f457806370a082311461039757806395d89b411461031f578063a9059cbb1461028a578063d0fedf551461018d578063dd62ed3e146100e15763fc0c546a146100b6575f80fd5b346100dd575f3660031901126100dd575f546040516001600160a01b039091168152602090f35b5f80fd5b346100dd5760403660031901126100dd576100fa610869565b602061010461087f565b5f54604051636eb1769f60e11b81526001600160a01b0394851660048201529184166024830152909283916044918391165afa8015610182575f9061014f575b602090604051908152f35b506020813d60201161017a575b8161016960209383610895565b810103126100dd5760209051610144565b3d915061015c565b6040513d5f823e3d90fd5b60803660031901126100dd576101a1610869565b60443580151581036100dd576064359081151582036100dd5760206102095f946101cc600154610962565b600155855460405163a9059cbb60e01b81526001600160a01b03928316600482015260248035908201529687939190921691839182906044820190565b03925af1928315610182575f93610259575b50610240576001548015610245575f1901600155610240576020906040519015158152f35b6109f5565b634e487b7160e01b5f52601160045260245ffd5b61027c91935060203d602011610283575b6102748183610895565b81019061094a565b918361021b565b503d61026a565b346100dd5760403660031901126100dd575f60206102e36102a9610869565b835460405163a9059cbb60e01b81526001600160a01b03928316600482015260248035908201529485939190921691839182906044820190565b03925af18015610182576020915f91610302575b506040519015158152f35b6103199150823d8411610283576102748183610895565b826102f7565b346100dd575f3660031901126100dd575f80546040516395d89b4160e01b81529190829060049082906001600160a01b03165afa801561018257610371915f91610375575b506040519182918261083f565b0390f35b61039191503d805f833e6103898183610895565b8101906108e7565b82610364565b346100dd5760203660031901126100dd576103b0610869565b5f546040516370a0823160e01b81526001600160a01b0392831660048201529160209183916024918391165afa8015610182575f9061014f57602090604051908152f35b60c03660031901126100dd57610408610869565b6084359081151582036100dd5760a4359081151582036100dd576001600160a01b038116926104485f808080604435895af1610442610970565b5061099f565b6104c6575f805460405163a9059cbb60e01b81526001600160a01b0393841660048201526024803590820152926020928492604492849291165af1801561018257610499915f916104d9575061099f565b6104c6575f808080602094606435905af16104b2610970565b506104bc8161099f565b6040519015158152f35b6104d1600154610962565b6001556109f5565b6104f2915060203d602011610283576102748183610895565b84610442565b346100dd575f3660031901126100dd576020600154604051908152f35b346100dd575f3660031901126100dd575f5460405163313ce56760e01b815290602090829060049082906001600160a01b03165afa8015610182575f90610565575b60209060ff60405191168152f35b506020813d60201161059a575b8161057f60209383610895565b810103126100dd575160ff811681036100dd57602090610557565b3d9150610572565b60603660031901126100dd576105b6610869565b6105c1600154610962565b6001555f805460405163a9059cbb60e01b81526001600160a01b03848116600483015260248035908301529092602092849260449284929091165af1908115610182575f916106b8575b50156106805760405163d0fedf5560e01b81526001600160a01b039091166004820152604480356024830152600190820181905260648201526020816084815f305af1610663575b61065e600154610962565b600155005b61067b9060203d602011610283576102748183610895565b610653565b60405162461bcd60e51b815260206004820152601060248201526f3330b4b6103a37903a3930b739b332b960811b6044820152606490fd5b6106d1915060203d602011610283576102748183610895565b8261060b565b346100dd5760603660031901126100dd576106f0610869565b60206106fa61087f565b5f80546040516323b872dd60e01b81526001600160a01b039586166004820152928516602484015260448035908401529193849260649284929091165af18015610182576020915f9161030257506040519015158152f35b346100dd575f3660031901126100dd575f546040516318160ddd60e01b815290602090829060049082906001600160a01b03165afa8015610182575f9061014f57602090604051908152f35b346100dd5760403660031901126100dd575f60206102e36107bd610869565b835460405163095ea7b360e01b81526001600160a01b03928316600482015260248035908201529485939190921691839182906044820190565b346100dd575f3660031901126100dd575f80546306fdde0360e01b8352829060049082906001600160a01b03165afa801561018257610371915f916103755750604051918291825b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100dd57565b602435906001600160a01b03821682036100dd57565b90601f8019910116810190811067ffffffffffffffff8211176108b757604052565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff81116108b757601f01601f191660200190565b6020818303126100dd5780519067ffffffffffffffff82116100dd570181601f820112156100dd5780519061091b826108cb565b926109296040519485610895565b828452602083830101116100dd57815f9260208093018386015e8301015290565b908160209103126100dd575180151581036100dd5790565b5f1981146102455760010190565b3d1561099a573d90610981826108cb565b9161098f6040519384610895565b82523d5f602084013e565b606090565b156109a657565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b60405162461bcd60e51b815260206004820152600b60248201526a726576657274206865726560a81b6044820152606490fdfea26469706673582212202496c4e91e55108a7d7b0b7487999ad2c0830724c460aa7c4cc5bccef5e8249e64736f6c634300081a0033", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde03146107f757508063095ea7b31461079e57806318160ddd1461075257806323b872dd146106d7578063268d070a146105a2578063313ce5671461051557806361bc221a146104f85780636bc7b7cd146103f457806370a082311461039757806395d89b411461031f578063a9059cbb1461028a578063d0fedf551461018d578063dd62ed3e146100e15763fc0c546a146100b6575f80fd5b346100dd575f3660031901126100dd575f546040516001600160a01b039091168152602090f35b5f80fd5b346100dd5760403660031901126100dd576100fa610869565b602061010461087f565b5f54604051636eb1769f60e11b81526001600160a01b0394851660048201529184166024830152909283916044918391165afa8015610182575f9061014f575b602090604051908152f35b506020813d60201161017a575b8161016960209383610895565b810103126100dd5760209051610144565b3d915061015c565b6040513d5f823e3d90fd5b60803660031901126100dd576101a1610869565b60443580151581036100dd576064359081151582036100dd5760206102095f946101cc600154610962565b600155855460405163a9059cbb60e01b81526001600160a01b03928316600482015260248035908201529687939190921691839182906044820190565b03925af1928315610182575f93610259575b50610240576001548015610245575f1901600155610240576020906040519015158152f35b6109f5565b634e487b7160e01b5f52601160045260245ffd5b61027c91935060203d602011610283575b6102748183610895565b81019061094a565b918361021b565b503d61026a565b346100dd5760403660031901126100dd575f60206102e36102a9610869565b835460405163a9059cbb60e01b81526001600160a01b03928316600482015260248035908201529485939190921691839182906044820190565b03925af18015610182576020915f91610302575b506040519015158152f35b6103199150823d8411610283576102748183610895565b826102f7565b346100dd575f3660031901126100dd575f80546040516395d89b4160e01b81529190829060049082906001600160a01b03165afa801561018257610371915f91610375575b506040519182918261083f565b0390f35b61039191503d805f833e6103898183610895565b8101906108e7565b82610364565b346100dd5760203660031901126100dd576103b0610869565b5f546040516370a0823160e01b81526001600160a01b0392831660048201529160209183916024918391165afa8015610182575f9061014f57602090604051908152f35b60c03660031901126100dd57610408610869565b6084359081151582036100dd5760a4359081151582036100dd576001600160a01b038116926104485f808080604435895af1610442610970565b5061099f565b6104c6575f805460405163a9059cbb60e01b81526001600160a01b0393841660048201526024803590820152926020928492604492849291165af1801561018257610499915f916104d9575061099f565b6104c6575f808080602094606435905af16104b2610970565b506104bc8161099f565b6040519015158152f35b6104d1600154610962565b6001556109f5565b6104f2915060203d602011610283576102748183610895565b84610442565b346100dd575f3660031901126100dd576020600154604051908152f35b346100dd575f3660031901126100dd575f5460405163313ce56760e01b815290602090829060049082906001600160a01b03165afa8015610182575f90610565575b60209060ff60405191168152f35b506020813d60201161059a575b8161057f60209383610895565b810103126100dd575160ff811681036100dd57602090610557565b3d9150610572565b60603660031901126100dd576105b6610869565b6105c1600154610962565b6001555f805460405163a9059cbb60e01b81526001600160a01b03848116600483015260248035908301529092602092849260449284929091165af1908115610182575f916106b8575b50156106805760405163d0fedf5560e01b81526001600160a01b039091166004820152604480356024830152600190820181905260648201526020816084815f305af1610663575b61065e600154610962565b600155005b61067b9060203d602011610283576102748183610895565b610653565b60405162461bcd60e51b815260206004820152601060248201526f3330b4b6103a37903a3930b739b332b960811b6044820152606490fd5b6106d1915060203d602011610283576102748183610895565b8261060b565b346100dd5760603660031901126100dd576106f0610869565b60206106fa61087f565b5f80546040516323b872dd60e01b81526001600160a01b039586166004820152928516602484015260448035908401529193849260649284929091165af18015610182576020915f9161030257506040519015158152f35b346100dd575f3660031901126100dd575f546040516318160ddd60e01b815290602090829060049082906001600160a01b03165afa8015610182575f9061014f57602090604051908152f35b346100dd5760403660031901126100dd575f60206102e36107bd610869565b835460405163095ea7b360e01b81526001600160a01b03928316600482015260248035908201529485939190921691839182906044820190565b346100dd575f3660031901126100dd575f80546306fdde0360e01b8352829060049082906001600160a01b03165afa801561018257610371915f916103755750604051918291825b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100dd57565b602435906001600160a01b03821682036100dd57565b90601f8019910116810190811067ffffffffffffffff8211176108b757604052565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff81116108b757601f01601f191660200190565b6020818303126100dd5780519067ffffffffffffffff82116100dd570181601f820112156100dd5780519061091b826108cb565b926109296040519485610895565b828452602083830101116100dd57815f9260208093018386015e8301015290565b908160209103126100dd575180151581036100dd5790565b5f1981146102455760010190565b3d1561099a573d90610981826108cb565b9161098f6040519384610895565b82523d5f602084013e565b606090565b156109a657565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b60405162461bcd60e51b815260206004820152600b60248201526a726576657274206865726560a81b6044820152606490fdfea26469706673582212202496c4e91e55108a7d7b0b7487999ad2c0830724c460aa7c4cc5bccef5e8249e64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/erc20/testdata/ERC20TestCaller.sol", + "buildInfoId": "solc-0_8_26-4dce5b0c240c2620fa4305f1f2544c06dfbe7597" +} \ No newline at end of file diff --git a/precompiles/erc20/testdata/ERC20TestCaller.sol b/precompiles/erc20/testdata/ERC20TestCaller.sol index add1b0b25..8db366ab7 100644 --- a/precompiles/erc20/testdata/ERC20TestCaller.sol +++ b/precompiles/erc20/testdata/ERC20TestCaller.sol @@ -1,17 +1,17 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity >=0.8.17; +pragma solidity ^0.8.20; -import "../IERC20Metadata.sol" as erc20Precompile; +import "../ERC20I.sol" as erc20Precompile; /// @title ERC20TestCaller /// @author Erric -/// @dev This contract is used to test external contract calls to the ERC20 precompile. +/// @dev This contract is used to test external contract calls to the ERC20I precompile. contract ERC20TestCaller { - erc20Precompile.IERC20Metadata public token; + erc20Precompile.ERC20I public token; uint256 public counter; constructor(address tokenAddress) { - token = erc20Precompile.IERC20Metadata(tokenAddress); + token = erc20Precompile.ERC20I(tokenAddress); counter = 0; } @@ -122,4 +122,4 @@ contract ERC20TestCaller { {} catch {} counter++; } -} +} \ No newline at end of file diff --git a/precompiles/erc20/tx.go b/precompiles/erc20/tx.go index f1ed409f2..24bc40cdd 100644 --- a/precompiles/erc20/tx.go +++ b/precompiles/erc20/tx.go @@ -9,6 +9,8 @@ import ( "cosmossdk.io/math" + cmn "github.com/cosmos/evm/precompiles/common" + sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ) @@ -60,9 +62,6 @@ func (p *Precompile) TransferFrom( return p.transfer(ctx, contract, stateDB, method, from, to, amount) } -// transfer is a common function that handles transfers for the ERC-20 Transfer -// and TransferFrom methods. It executes a bank Send message. If the spender isn't -// the sender of the transfer, it checks the allowance and updates it accordingly. // transfer is a common function that handles transfers for the ERC-20 Transfer // and TransferFrom methods. It executes a bank Send message. If the spender isn't // the sender of the transfer, it checks the allowance and updates it accordingly. @@ -79,7 +78,7 @@ func (p *Precompile) transfer( msg := banktypes.NewMsgSend(from.Bytes(), to.Bytes(), coins) if err = msg.Amount.Validate(); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrInvalidAmount, err.Error()) } isTransferFrom := method.Name == TransferFromMethod @@ -89,41 +88,41 @@ func (p *Precompile) transfer( if isTransferFrom { prevAllowance, err := p.erc20Keeper.GetAllowance(ctx, p.Address(), from, spenderAddr) if err != nil { - return nil, ConvertErrToERC20Error(err) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, TransferFromMethod, err.Error()) } newAllowance = new(big.Int).Sub(prevAllowance, amount) if newAllowance.Sign() < 0 { - return nil, ErrInsufficientAllowance + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrERC20InsufficientAllowance, spenderAddr, prevAllowance, amount) } if newAllowance.Sign() == 0 { - // If the new allowance is 0, we need to delete it from the store. err = p.erc20Keeper.DeleteAllowance(ctx, p.Address(), from, spenderAddr) } else { - // If the new allowance is not 0, we need to set it in the store. err = p.erc20Keeper.SetAllowance(ctx, p.Address(), from, spenderAddr, newAllowance) } if err != nil { - return nil, ConvertErrToERC20Error(err) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, TransferFromMethod, err.Error()) } } msgSrv := NewMsgServerImpl(p.BankKeeper) if err = msgSrv.Send(ctx, msg); err != nil { - // This should return an error to avoid the contract from being executed and an event being emitted - return nil, ConvertErrToERC20Error(err) + spendable := p.BankKeeper.SpendableCoin(ctx, from.Bytes(), p.tokenPair.Denom) + bal := spendable.Amount.BigInt() + if amount.Cmp(bal) > 0 { + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrERC20InsufficientBalance, from, bal, amount) + } + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, method.Name, err.Error()) } if err = p.EmitTransferEvent(ctx, stateDB, from, to, amount); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, method.Name, err.Error()) } - // NOTE: if it's a direct transfer, we return here but if used through transferFrom, - // we need to emit the approval event with the new allowance. if isTransferFrom { if err = p.EmitApprovalEvent(ctx, stateDB, from, spenderAddr, newAllowance); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, method.Name, err.Error()) } } diff --git a/precompiles/erc20/types.go b/precompiles/erc20/types.go index 685f6fa62..110384b3e 100644 --- a/precompiles/erc20/types.go +++ b/precompiles/erc20/types.go @@ -5,6 +5,8 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" + + cmn "github.com/cosmos/evm/precompiles/common" ) // EventTransfer defines the event data for the ERC20 Transfer events. @@ -27,17 +29,17 @@ func ParseTransferArgs(args []interface{}) ( to common.Address, amount *big.Int, err error, ) { if len(args) != 2 { - return common.Address{}, nil, fmt.Errorf("invalid number of arguments; expected 2; got: %d", len(args)) + return common.Address{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } to, ok := args[0].(common.Address) if !ok { - return common.Address{}, nil, fmt.Errorf("invalid to address: %v", args[0]) + return common.Address{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } amount, ok = args[1].(*big.Int) if !ok { - return common.Address{}, nil, fmt.Errorf("invalid amount: %v", args[1]) + return common.Address{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[1])) } return to, amount, nil @@ -49,22 +51,22 @@ func ParseTransferFromArgs(args []interface{}) ( from, to common.Address, amount *big.Int, err error, ) { if len(args) != 3 { - return common.Address{}, common.Address{}, nil, fmt.Errorf("invalid number of arguments; expected 3; got: %d", len(args)) + return common.Address{}, common.Address{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(int64(len(args)))) } from, ok := args[0].(common.Address) if !ok { - return common.Address{}, common.Address{}, nil, fmt.Errorf("invalid from address: %v", args[0]) + return common.Address{}, common.Address{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } to, ok = args[1].(common.Address) if !ok { - return common.Address{}, common.Address{}, nil, fmt.Errorf("invalid to address: %v", args[1]) + return common.Address{}, common.Address{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } amount, ok = args[2].(*big.Int) if !ok { - return common.Address{}, common.Address{}, nil, fmt.Errorf("invalid amount: %v", args[2]) + return common.Address{}, common.Address{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[2])) } return from, to, amount, nil @@ -76,17 +78,17 @@ func ParseApproveArgs(args []interface{}) ( spender common.Address, amount *big.Int, err error, ) { if len(args) != 2 { - return common.Address{}, nil, fmt.Errorf("invalid number of arguments; expected 2; got: %d", len(args)) + return common.Address{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } spender, ok := args[0].(common.Address) if !ok { - return common.Address{}, nil, fmt.Errorf("invalid spender address: %v", args[0]) + return common.Address{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } amount, ok = args[1].(*big.Int) if !ok { - return common.Address{}, nil, fmt.Errorf("invalid amount: %v", args[1]) + return common.Address{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[1])) } return spender, amount, nil @@ -98,17 +100,17 @@ func ParseAllowanceArgs(args []interface{}) ( owner, spender common.Address, err error, ) { if len(args) != 2 { - return common.Address{}, common.Address{}, fmt.Errorf("invalid number of arguments; expected 2; got: %d", len(args)) + return common.Address{}, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } owner, ok := args[0].(common.Address) if !ok { - return common.Address{}, common.Address{}, fmt.Errorf("invalid owner address: %v", args[0]) + return common.Address{}, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } spender, ok = args[1].(common.Address) if !ok { - return common.Address{}, common.Address{}, fmt.Errorf("invalid spender address: %v", args[1]) + return common.Address{}, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } return owner, spender, nil @@ -117,12 +119,12 @@ func ParseAllowanceArgs(args []interface{}) ( // ParseBalanceOfArgs parses the balanceOf arguments and returns the account address. func ParseBalanceOfArgs(args []interface{}) (common.Address, error) { if len(args) != 1 { - return common.Address{}, fmt.Errorf("invalid number of arguments; expected 1; got: %d", len(args)) + return common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } account, ok := args[0].(common.Address) if !ok { - return common.Address{}, fmt.Errorf("invalid account address: %v", args[0]) + return common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } return account, nil diff --git a/precompiles/gov/IGov.sol b/precompiles/gov/IGov.sol index 7fa92a8ea..5497d28e3 100644 --- a/precompiles/gov/IGov.sol +++ b/precompiles/gov/IGov.sol @@ -93,7 +93,26 @@ struct Params { /// @author The Evmos Core Team /// @title Gov Precompile Contract /// @dev The interface through which solidity contracts will interact with Gov -interface IGov { +interface IGov is IPrecompile { + /// @notice Argument or payload validation that does not map to a common IPrecompile error. + error GovInputInvalid(string callMethod, string reason); + /// @notice Invalid JSON proposal payload (protoJSON envelope). + error InvalidProposalJSON(string callMethod, string reason); + /// @notice Invalid Vote option argument. + error InvalidOption(string callMethod, string reason); + /// @notice Invalid metadata argument. + error InvalidMetadata(string callMethod, string reason); + /// @notice Failed to unpack votes query input. + error VotesInputUnpackFailed(string reason); + /// @notice Failed to unpack deposits query input. + error DepositsInputUnpackFailed(string reason); + /// @notice Failed to unpack proposals query input. + error ProposalsInputUnpackFailed(string reason); + /// @notice Failed to unpack voteWeighted options input. + error WeightedVoteOptionsUnpackFailed(string reason); + /// @notice Invalid proposal ID argument. + error InvalidProposalID(string reason); + /// @dev SubmitProposal defines an Event emitted when a proposal is submitted. /// @param proposer the address of the proposer /// @param proposalId the proposal of id diff --git a/precompiles/gov/abi.json b/precompiles/gov/abi.json index c318e6a2a..2f2387207 100644 --- a/precompiles/gov/abi.json +++ b/precompiles/gov/abi.json @@ -1,4 +1,285 @@ [ + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ABISetupFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "DepositsInputUnpackFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "eventKind", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EventEmitFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "GovInputInvalid", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "bad", + "type": "string" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "amount", + "type": "string" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "height", + "type": "string" + } + ], + "name": "InvalidHeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidMetadata", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + } + ], + "name": "InvalidNumberOfArgs", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidOption", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidProposalID", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidProposalJSON", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "pubkey", + "type": "string" + } + ], + "name": "InvalidPubkey", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPubkeySize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msgMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "MsgServerFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ProposalsInputUnpackFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "queryMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "QueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + } + ], + "name": "RequesterIsNotMsgSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "methodName", + "type": "string" + } + ], + "name": "UnknownMethod", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "VotesInputUnpackFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "WeightedVoteOptionsUnpackFailed", + "type": "error" + }, { "anonymous": false, "inputs": [ diff --git a/precompiles/gov/errors.go b/precompiles/gov/errors.go index 7da2e1118..f81aadf68 100644 --- a/precompiles/gov/errors.go +++ b/precompiles/gov/errors.go @@ -27,4 +27,23 @@ const ( ErrInvalidDepositor = "invalid depositor address: %s" // ErrInvalidDeposits invalid deposits. ErrInvalidDeposits = "invalid deposits %s " + + // SolidityErrGovInputInvalid is defined in IGov.sol. + SolidityErrGovInputInvalid = "GovInputInvalid" + // SolidityErrInvalidProposalJSON is defined in IGov.sol. + SolidityErrInvalidProposalJSON = "InvalidProposalJSON" + // SolidityErrInvalidOption is defined in IGov.sol. + SolidityErrInvalidOption = "InvalidOption" + // SolidityErrInvalidMetadata is defined in IGov.sol. + SolidityErrInvalidMetadata = "InvalidMetadata" + // SolidityErrVotesInputUnpackFailed is defined in IGov.sol. + SolidityErrVotesInputUnpackFailed = "VotesInputUnpackFailed" + // SolidityErrDepositsInputUnpackFailed is defined in IGov.sol. + SolidityErrDepositsInputUnpackFailed = "DepositsInputUnpackFailed" + // SolidityErrProposalsInputUnpackFailed is defined in IGov.sol. + SolidityErrProposalsInputUnpackFailed = "ProposalsInputUnpackFailed" + // SolidityErrWeightedVoteOptionsUnpackFailed is defined in IGov.sol. + SolidityErrWeightedVoteOptionsUnpackFailed = "WeightedVoteOptionsUnpackFailed" + // SolidityErrInvalidProposalID is defined in IGov.sol. + SolidityErrInvalidProposalID = "InvalidProposalID" ) diff --git a/precompiles/gov/gov.go b/precompiles/gov/gov.go index d03be3be8..e84f4f1a8 100644 --- a/precompiles/gov/gov.go +++ b/precompiles/gov/gov.go @@ -2,7 +2,6 @@ package gov import ( "bytes" - "fmt" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -100,7 +99,7 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]by func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Contract, readOnly bool) ([]byte, error) { method, args, err := cmn.SetupABI(p.ABI, contract, readOnly, p.IsTransaction) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrABISetupFailed, err.Error()) } var bz []byte @@ -138,7 +137,7 @@ func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Co case GetConstitutionMethod: bz, err = p.GetConstitution(ctx, method, contract, args) default: - return nil, fmt.Errorf(cmn.ErrUnknownMethod, method.Name) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrUnknownMethod, method.Name) } return bz, err diff --git a/precompiles/gov/query.go b/precompiles/gov/query.go index 0b389b9a0..ec7f437da 100644 --- a/precompiles/gov/query.go +++ b/precompiles/gov/query.go @@ -4,6 +4,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" + cmn "github.com/cosmos/evm/precompiles/common" + sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -42,12 +44,12 @@ func (p *Precompile) GetVotes( res, err := p.govQuerier.Votes(ctx, queryVotesReq) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetVotesMethod, err.Error()) } output, err := new(VotesOutput).FromResponse(res) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetVotesMethod, err.Error()) } return method.Outputs.Pack(output.Votes, output.PageResponse) } @@ -66,12 +68,12 @@ func (p *Precompile) GetVote( res, err := p.govQuerier.Vote(ctx, queryVotesReq) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetVoteMethod, err.Error()) } output, err := new(VoteOutput).FromResponse(res) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetVoteMethod, err.Error()) } return method.Outputs.Pack(output.Vote) } @@ -90,12 +92,12 @@ func (p *Precompile) GetDeposit( res, err := p.govQuerier.Deposit(ctx, queryDepositReq) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetDepositMethod, err.Error()) } output, err := new(DepositOutput).FromResponse(res) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetDepositMethod, err.Error()) } return method.Outputs.Pack(output.Deposit) } @@ -114,12 +116,12 @@ func (p *Precompile) GetDeposits( res, err := p.govQuerier.Deposits(ctx, queryDepositsReq) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetDepositsMethod, err.Error()) } output, err := new(DepositsOutput).FromResponse(res) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetDepositsMethod, err.Error()) } return method.Outputs.Pack(output.Deposits, output.PageResponse) } @@ -138,7 +140,7 @@ func (p *Precompile) GetTallyResult( res, err := p.govQuerier.TallyResult(ctx, queryTallyResultReq) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetTallyResultMethod, err.Error()) } output := new(TallyResultOutput).FromResponse(res) @@ -159,12 +161,12 @@ func (p *Precompile) GetProposal( res, err := p.govQuerier.Proposal(ctx, queryProposalReq) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetProposalMethod, err.Error()) } output, err := new(ProposalOutput).FromResponse(res) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetProposalMethod, err.Error()) } return method.Outputs.Pack(output.Proposal) } @@ -183,12 +185,12 @@ func (p *Precompile) GetProposals( res, err := p.govQuerier.Proposals(ctx, queryProposalsReq) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetProposalsMethod, err.Error()) } output, err := new(ProposalsOutput).FromResponse(res) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetProposalsMethod, err.Error()) } return method.Outputs.Pack(output.Proposals, output.PageResponse) } @@ -207,7 +209,7 @@ func (p *Precompile) GetParams( res, err := p.govQuerier.Params(ctx, queryParamsReq) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetParamsMethod, err.Error()) } output := new(ParamsOutput).FromResponse(res) @@ -228,7 +230,7 @@ func (p *Precompile) GetConstitution( res, err := p.govQuerier.Constitution(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetConstitutionMethod, err.Error()) } return method.Outputs.Pack(res.Constitution) diff --git a/precompiles/gov/tx.go b/precompiles/gov/tx.go index 46569261b..617d7d87c 100644 --- a/precompiles/gov/tx.go +++ b/precompiles/gov/tx.go @@ -1,8 +1,6 @@ package gov import ( - "fmt" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" @@ -39,16 +37,16 @@ func (p *Precompile) SubmitProposal( msgSender := contract.Caller() if msgSender != proposerHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), proposerHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, proposerHexAddr) } res, err := p.govMsgServer.SubmitProposal(ctx, msg) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, SubmitProposalMethod, err.Error()) } if err = p.EmitSubmitProposalEvent(ctx, stateDB, proposerHexAddr, res.ProposalId); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, SubmitProposalMethod, err.Error()) } return method.Outputs.Pack(res.ProposalId) @@ -69,15 +67,15 @@ func (p *Precompile) Deposit( msgSender := contract.Caller() if msgSender != depositorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), depositorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, depositorHexAddr) } if _, err = p.govMsgServer.Deposit(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, DepositMethod, err.Error()) } if err = p.EmitDepositEvent(ctx, stateDB, depositorHexAddr, msg.ProposalId, msg.Amount); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, DepositMethod, err.Error()) } return method.Outputs.Pack(true) @@ -98,15 +96,15 @@ func (p *Precompile) CancelProposal( msgSender := contract.Caller() if msgSender != proposerHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), proposerHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, proposerHexAddr) } if _, err = p.govMsgServer.CancelProposal(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, CancelProposalMethod, err.Error()) } if err = p.EmitCancelProposalEvent(ctx, stateDB, proposerHexAddr, msg.ProposalId); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, CancelProposalMethod, err.Error()) } return method.Outputs.Pack(true) @@ -127,22 +125,22 @@ func (p Precompile) Vote( msgSender := contract.Caller() if msgSender != voterHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), voterHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, voterHexAddr) } if _, err = p.govMsgServer.Vote(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, VoteMethod, err.Error()) } if err = p.EmitVoteEvent(ctx, stateDB, voterHexAddr, msg.ProposalId, int32(msg.Option)); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, VoteMethod, err.Error()) } return method.Outputs.Pack(true) } // VoteWeighted defines a method to add a vote on a specific proposal. -func (p Precompile) VoteWeighted( +func (p *Precompile) VoteWeighted( ctx sdk.Context, contract *vm.Contract, stateDB vm.StateDB, @@ -156,15 +154,15 @@ func (p Precompile) VoteWeighted( msgSender := contract.Caller() if msgSender != voterHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), voterHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, voterHexAddr) } if _, err = p.govMsgServer.VoteWeighted(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, VoteWeightedMethod, err.Error()) } if err = p.EmitVoteWeightedEvent(ctx, stateDB, voterHexAddr, msg.ProposalId, options); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, VoteWeightedMethod, err.Error()) } return method.Outputs.Pack(true) diff --git a/precompiles/gov/types.go b/precompiles/gov/types.go index 465ab940f..835d6bf2d 100644 --- a/precompiles/gov/types.go +++ b/precompiles/gov/types.go @@ -3,6 +3,7 @@ package gov import ( "encoding/json" "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -11,7 +12,6 @@ import ( "github.com/cosmos/evm/utils" "cosmossdk.io/core/address" - sdkerrors "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -119,24 +119,24 @@ func NewMsgSubmitProposal(args []interface{}, cdc codec.Codec, addrCdc address.C // 1. Argument sanity // ------------------------------------------------------------------------- if len(args) != 3 { - return nil, emptyAddr, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 3, len(args)) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(int64(len(args)))) } proposer, ok := args[0].(common.Address) if !ok || proposer == emptyAddr { - return nil, emptyAddr, fmt.Errorf(ErrInvalidProposer, args[0]) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } // 1-a JSON blob jsonBlob, ok := args[1].([]byte) if !ok || len(jsonBlob) == 0 { - return nil, emptyAddr, fmt.Errorf(ErrInvalidProposalJSON, "jsonBlob arg") + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalJSON, SubmitProposalMethod, fmt.Sprintf(ErrInvalidProposalJSON, "jsonBlob arg")) } // 1-b Deposit coins, err := cmn.ToCoins(args[2]) if err != nil { - return nil, emptyAddr, fmt.Errorf(ErrInvalidDeposits, "deposit arg") + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[2])) } // ------------------------------------------------------------------------- @@ -144,7 +144,7 @@ func NewMsgSubmitProposal(args []interface{}, cdc codec.Codec, addrCdc address.C // ------------------------------------------------------------------------- amt, err := cmn.NewSdkCoinsFromCoins(coins) if err != nil { - return nil, emptyAddr, fmt.Errorf(ErrInvalidDeposits, "deposit arg") + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", err)) } // 1. Decode the envelope @@ -156,7 +156,7 @@ func NewMsgSubmitProposal(args []interface{}, cdc codec.Codec, addrCdc address.C Expedited bool `json:"expedited"` } if err := json.Unmarshal(jsonBlob, &prop); err != nil { - return nil, emptyAddr, sdkerrors.Wrap(err, "invalid proposal JSON") + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalJSON, SubmitProposalMethod, err.Error()) } // 2. Decode each message @@ -164,7 +164,7 @@ func NewMsgSubmitProposal(args []interface{}, cdc codec.Codec, addrCdc address.C for i, m := range prop.Messages { var msg sdk.Msg if err := cdc.UnmarshalInterfaceJSON(m, &msg); err != nil { - return nil, emptyAddr, sdkerrors.Wrapf(err, "message %d", i) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalJSON, SubmitProposalMethod, fmt.Sprintf("message %d: %v", i, err)) } msgs[i] = msg } @@ -174,7 +174,7 @@ func NewMsgSubmitProposal(args []interface{}, cdc codec.Codec, addrCdc address.C for i, m := range msgs { anyVal, err := codectypes.NewAnyWithValue(m) if err != nil { - return nil, common.Address{}, err + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalJSON, SubmitProposalMethod, err.Error()) } anys[i] = anyVal } @@ -182,7 +182,7 @@ func NewMsgSubmitProposal(args []interface{}, cdc codec.Codec, addrCdc address.C // 4. Build & dispatch MsgSubmitProposal proposerAddr, err := addrCdc.BytesToString(proposer.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode proposer address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } smsg := &govv1.MsgSubmitProposal{ Messages: anys, @@ -202,32 +202,32 @@ func NewMsgSubmitProposal(args []interface{}, cdc codec.Codec, addrCdc address.C func NewMsgDeposit(args []interface{}, addrCdc address.Codec) (*govv1.MsgDeposit, common.Address, error) { emptyAddr := common.Address{} if len(args) != 3 { - return nil, emptyAddr, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 3, len(args)) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(int64(len(args)))) } depositor, ok := args[0].(common.Address) if !ok || depositor == emptyAddr { - return nil, emptyAddr, fmt.Errorf(ErrInvalidDepositor, args[0]) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } proposalID, ok := args[1].(uint64) if !ok { - return nil, emptyAddr, fmt.Errorf(ErrInvalidProposalID, args[1]) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, fmt.Sprintf("%v", args[1])) } coins, err := cmn.ToCoins(args[2]) if err != nil { - return nil, emptyAddr, fmt.Errorf(ErrInvalidDeposits, "deposit arg") + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[2])) } amt, err := cmn.NewSdkCoinsFromCoins(coins) if err != nil { - return nil, emptyAddr, fmt.Errorf(ErrInvalidDeposits, "deposit arg") + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", err)) } depositorAddr, err := addrCdc.BytesToString(depositor.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode depositor address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &govv1.MsgDeposit{ ProposalId: proposalID, @@ -243,22 +243,22 @@ func NewMsgDeposit(args []interface{}, addrCdc address.Codec) (*govv1.MsgDeposit func NewMsgCancelProposal(args []interface{}, addrCdc address.Codec) (*govv1.MsgCancelProposal, common.Address, error) { emptyAddr := common.Address{} if len(args) != 2 { - return nil, emptyAddr, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } proposer, ok := args[0].(common.Address) if !ok || proposer == emptyAddr { - return nil, emptyAddr, fmt.Errorf(ErrInvalidProposer, args[0]) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } proposalID, ok := args[1].(uint64) if !ok { - return nil, emptyAddr, fmt.Errorf(ErrInvalidProposalID, args[1]) + return nil, emptyAddr, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, fmt.Sprintf("%v", args[1])) } proposerAddr, err := addrCdc.BytesToString(proposer.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode proposer address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } return govv1.NewMsgCancelProposal( proposalID, @@ -269,32 +269,32 @@ func NewMsgCancelProposal(args []interface{}, addrCdc address.Codec) (*govv1.Msg // NewMsgVote creates a new MsgVote instance. func NewMsgVote(args []interface{}, addrCdc address.Codec) (*govv1.MsgVote, common.Address, error) { if len(args) != 4 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(int64(len(args)))) } voterAddress, ok := args[0].(common.Address) if !ok || voterAddress == (common.Address{}) { - return nil, common.Address{}, fmt.Errorf(ErrInvalidVoter, args[0]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } proposalID, ok := args[1].(uint64) if !ok { - return nil, common.Address{}, fmt.Errorf(ErrInvalidProposalID, args[1]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, fmt.Sprintf("%v", args[1])) } option, ok := args[2].(uint8) if !ok { - return nil, common.Address{}, fmt.Errorf(ErrInvalidOption, args[2]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidOption, VoteMethod, fmt.Sprintf(ErrInvalidOption, args[2])) } metadata, ok := args[3].(string) if !ok { - return nil, common.Address{}, fmt.Errorf(ErrInvalidMetadata, args[3]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidMetadata, VoteMethod, fmt.Sprintf(ErrInvalidMetadata, args[3])) } voterAddr, err := addrCdc.BytesToString(voterAddress.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode voter address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &govv1.MsgVote{ ProposalId: proposalID, @@ -309,24 +309,24 @@ func NewMsgVote(args []interface{}, addrCdc address.Codec) (*govv1.MsgVote, comm // NewMsgVoteWeighted creates a new MsgVoteWeighted instance. func NewMsgVoteWeighted(method *abi.Method, args []interface{}, addrCdc address.Codec) (*govv1.MsgVoteWeighted, common.Address, WeightedVoteOptions, error) { if len(args) != 4 { - return nil, common.Address{}, WeightedVoteOptions{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) + return nil, common.Address{}, WeightedVoteOptions{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(int64(len(args)))) } voterAddress, ok := args[0].(common.Address) if !ok || voterAddress == (common.Address{}) { - return nil, common.Address{}, WeightedVoteOptions{}, fmt.Errorf(ErrInvalidVoter, args[0]) + return nil, common.Address{}, WeightedVoteOptions{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } proposalID, ok := args[1].(uint64) if !ok { - return nil, common.Address{}, WeightedVoteOptions{}, fmt.Errorf(ErrInvalidProposalID, args[1]) + return nil, common.Address{}, WeightedVoteOptions{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, fmt.Sprintf("%v", args[1])) } // Unpack the input struct var options WeightedVoteOptions arguments := abi.Arguments{method.Inputs[2]} if err := arguments.Copy(&options, []interface{}{args[2]}); err != nil { - return nil, common.Address{}, WeightedVoteOptions{}, fmt.Errorf("error while unpacking args to Options struct: %s", err) + return nil, common.Address{}, WeightedVoteOptions{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrWeightedVoteOptionsUnpackFailed, err.Error()) } weightedOptions := make([]*govv1.WeightedVoteOption, len(options)) @@ -339,12 +339,12 @@ func NewMsgVoteWeighted(method *abi.Method, args []interface{}, addrCdc address. metadata, ok := args[3].(string) if !ok { - return nil, common.Address{}, WeightedVoteOptions{}, fmt.Errorf(ErrInvalidMetadata, args[3]) + return nil, common.Address{}, WeightedVoteOptions{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidMetadata, VoteWeightedMethod, fmt.Sprintf(ErrInvalidMetadata, args[3])) } voterAddr, err := addrCdc.BytesToString(voterAddress.Bytes()) if err != nil { - return nil, common.Address{}, WeightedVoteOptions{}, fmt.Errorf("failed to decode voter address: %w", err) + return nil, common.Address{}, WeightedVoteOptions{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &govv1.MsgVoteWeighted{ ProposalId: proposalID, @@ -359,12 +359,12 @@ func NewMsgVoteWeighted(method *abi.Method, args []interface{}, addrCdc address. // ParseVotesArgs parses the arguments for the Votes query. func ParseVotesArgs(method *abi.Method, args []interface{}) (*govv1.QueryVotesRequest, error) { if len(args) != 2 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } var input VotesInput if err := method.Inputs.Copy(&input, args); err != nil { - return nil, fmt.Errorf("error while unpacking args to VotesInput: %s", err) + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrVotesInputUnpackFailed, err.Error()) } return &govv1.QueryVotesRequest{ @@ -406,22 +406,22 @@ func (vo *VotesOutput) FromResponse(res *govv1.QueryVotesResponse) (*VotesOutput // ParseVoteArgs parses the arguments for the Votes query. func ParseVoteArgs(args []interface{}, addrCdc address.Codec) (*govv1.QueryVoteRequest, error) { if len(args) != 2 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } proposalID, ok := args[0].(uint64) if !ok { - return nil, fmt.Errorf(ErrInvalidProposalID, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, fmt.Sprintf("%v", args[0])) } voter, ok := args[1].(common.Address) if !ok { - return nil, fmt.Errorf(ErrInvalidVoter, args[1]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } voterAddr, err := addrCdc.BytesToString(voter.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode voter address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } return &govv1.QueryVoteRequest{ ProposalId: proposalID, @@ -452,22 +452,22 @@ func (vo *VoteOutput) FromResponse(res *govv1.QueryVoteResponse) (*VoteOutput, e // ParseDepositArgs parses the arguments for the Deposit query. func ParseDepositArgs(args []interface{}, addrCdc address.Codec) (*govv1.QueryDepositRequest, error) { if len(args) != 2 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } proposalID, ok := args[0].(uint64) if !ok { - return nil, fmt.Errorf(ErrInvalidProposalID, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, fmt.Sprintf("%v", args[0])) } depositor, ok := args[1].(common.Address) if !ok { - return nil, fmt.Errorf(ErrInvalidDepositor, args[1]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } depositorAddr, err := addrCdc.BytesToString(depositor.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode depositor address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } return &govv1.QueryDepositRequest{ ProposalId: proposalID, @@ -478,12 +478,12 @@ func ParseDepositArgs(args []interface{}, addrCdc address.Codec) (*govv1.QueryDe // ParseDepositsArgs parses the arguments for the Deposits query. func ParseDepositsArgs(method *abi.Method, args []interface{}) (*govv1.QueryDepositsRequest, error) { if len(args) != 2 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } var input DepositsInput if err := method.Inputs.Copy(&input, args); err != nil { - return nil, fmt.Errorf("error while unpacking args to DepositsInput: %s", err) + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrDepositsInputUnpackFailed, err.Error()) } return &govv1.QueryDepositsRequest{ @@ -495,12 +495,12 @@ func ParseDepositsArgs(method *abi.Method, args []interface{}) (*govv1.QueryDepo // ParseTallyResultArgs parses the arguments for the TallyResult query. func ParseTallyResultArgs(args []interface{}) (*govv1.QueryTallyResultRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } proposalID, ok := args[0].(uint64) if !ok { - return nil, fmt.Errorf(ErrInvalidProposalID, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } return &govv1.QueryTallyResultRequest{ @@ -606,12 +606,12 @@ type ProposalData struct { // ParseProposalArgs parses the arguments for the Proposal query func ParseProposalArgs(args []interface{}) (*govv1.QueryProposalRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } proposalID, ok := args[0].(uint64) if !ok { - return nil, fmt.Errorf(ErrInvalidProposalID, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } return &govv1.QueryProposalRequest{ @@ -622,12 +622,12 @@ func ParseProposalArgs(args []interface{}) (*govv1.QueryProposalRequest, error) // ParseProposalsArgs parses the arguments for the Proposals query func ParseProposalsArgs(method *abi.Method, args []interface{}, addrCdc address.Codec) (*govv1.QueryProposalsRequest, error) { if len(args) != 4 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(int64(len(args)))) } var input ProposalsInput if err := method.Inputs.Copy(&input, args); err != nil { - return nil, fmt.Errorf("error while unpacking args to ProposalsInput: %s", err) + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrProposalsInputUnpackFailed, err.Error()) } voter := "" @@ -635,7 +635,7 @@ func ParseProposalsArgs(method *abi.Method, args []interface{}, addrCdc address. var err error voter, err = addrCdc.BytesToString(input.Voter.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode voter address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } } @@ -644,7 +644,7 @@ func ParseProposalsArgs(method *abi.Method, args []interface{}, addrCdc address. var err error depositor, err = addrCdc.BytesToString(input.Depositor.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode depositor address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } } @@ -807,7 +807,7 @@ func (o *ParamsOutput) FromResponse(res *govv1.QueryParamsResponse) *ParamsOutpu // BuildQueryParamsRequest returns the structure for the governance parameters query. func BuildQueryParamsRequest(args []interface{}) (*govv1.QueryParamsRequest, error) { if len(args) != 0 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 0, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(0), big.NewInt(int64(len(args)))) } return &govv1.QueryParamsRequest{ @@ -818,7 +818,7 @@ func BuildQueryParamsRequest(args []interface{}) (*govv1.QueryParamsRequest, err // BuildQueryConstitutionRequest validates the args (none expected). func BuildQueryConstitutionRequest(args []interface{}) (*govv1.QueryConstitutionRequest, error) { if len(args) != 0 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 0, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(0), big.NewInt(int64(len(args)))) } return &govv1.QueryConstitutionRequest{}, nil } diff --git a/precompiles/gov/types_test.go b/precompiles/gov/types_test.go index 52e812526..ea338b6b9 100644 --- a/precompiles/gov/types_test.go +++ b/precompiles/gov/types_test.go @@ -10,6 +10,7 @@ import ( evmaddress "github.com/cosmos/evm/encoding/address" cmn "github.com/cosmos/evm/precompiles/common" + "github.com/cosmos/evm/precompiles/testutil" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -28,7 +29,7 @@ func TestNewMsgDeposit(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDepositor string wantProposalID uint64 }{ @@ -40,40 +41,40 @@ func TestNewMsgDeposit(t *testing.T) { wantProposalID: proposalID, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{depositorAddr, proposalID, validCoins, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 4), + name: "too many arguments", + args: []interface{}{depositorAddr, proposalID, validCoins, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(4)), }, { - name: "invalid depositor type", - args: []interface{}{"not-an-address", proposalID, validCoins}, - wantErr: true, - errMsg: fmt.Sprintf(ErrInvalidDepositor, "not-an-address"), + name: "invalid depositor type", + args: []interface{}{"not-an-address", proposalID, validCoins}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty depositor address", - args: []interface{}{common.Address{}, proposalID, validCoins}, - wantErr: true, - errMsg: fmt.Sprintf(ErrInvalidDepositor, common.Address{}), + name: "empty depositor address", + args: []interface{}{common.Address{}, proposalID, validCoins}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid proposal ID type", - args: []interface{}{depositorAddr, "not-a-uint64", validCoins}, - wantErr: true, - errMsg: "invalid proposal id", + name: "invalid proposal ID type", + args: []interface{}{depositorAddr, "not-a-uint64", validCoins}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, "not-a-uint64"), }, { - name: "invalid coins", - args: []interface{}{depositorAddr, proposalID, "invalid-coins"}, - wantErr: true, - errMsg: fmt.Sprintf(ErrInvalidDeposits, "deposit arg"), + name: "invalid coins", + args: []interface{}{depositorAddr, proposalID, "invalid-coins"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, "invalid-coins"), }, } @@ -82,8 +83,7 @@ func TestNewMsgDeposit(t *testing.T) { msg, returnAddr, err := NewMsgDeposit(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -110,7 +110,7 @@ func TestNewMsgCancelProposal(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantProposer string wantProposalID uint64 }{ @@ -122,34 +122,34 @@ func TestNewMsgCancelProposal(t *testing.T) { wantProposalID: proposalID, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{proposerAddr, proposalID, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 3), + name: "too many arguments", + args: []interface{}{proposerAddr, proposalID, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(3)), }, { - name: "invalid proposer type", - args: []interface{}{"not-an-address", proposalID}, - wantErr: true, - errMsg: fmt.Sprintf(ErrInvalidProposer, "not-an-address"), + name: "invalid proposer type", + args: []interface{}{"not-an-address", proposalID}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty proposer address", - args: []interface{}{common.Address{}, proposalID}, - wantErr: true, - errMsg: fmt.Sprintf(ErrInvalidProposer, common.Address{}), + name: "empty proposer address", + args: []interface{}{common.Address{}, proposalID}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid proposal ID type", - args: []interface{}{proposerAddr, "not-a-uint64"}, - wantErr: true, - errMsg: "invalid proposal id", + name: "invalid proposal ID type", + args: []interface{}{proposerAddr, "not-a-uint64"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, "not-a-uint64"), }, } @@ -158,8 +158,7 @@ func TestNewMsgCancelProposal(t *testing.T) { msg, returnAddr, err := NewMsgCancelProposal(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -187,7 +186,7 @@ func TestNewMsgVote(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantVoter string wantProposalID uint64 wantOption uint8 @@ -203,46 +202,46 @@ func TestNewMsgVote(t *testing.T) { wantMetadata: metadata, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{voterAddr, proposalID, option, metadata, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 5), + name: "too many arguments", + args: []interface{}{voterAddr, proposalID, option, metadata, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(5)), }, { - name: "invalid voter type", - args: []interface{}{"not-an-address", proposalID, option, metadata}, - wantErr: true, - errMsg: fmt.Sprintf(ErrInvalidVoter, "not-an-address"), + name: "invalid voter type", + args: []interface{}{"not-an-address", proposalID, option, metadata}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty voter address", - args: []interface{}{common.Address{}, proposalID, option, metadata}, - wantErr: true, - errMsg: fmt.Sprintf(ErrInvalidVoter, common.Address{}), + name: "empty voter address", + args: []interface{}{common.Address{}, proposalID, option, metadata}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid proposal ID type", - args: []interface{}{voterAddr, "not-a-uint64", option, metadata}, - wantErr: true, - errMsg: "invalid proposal id", + name: "invalid proposal ID type", + args: []interface{}{voterAddr, "not-a-uint64", option, metadata}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, "not-a-uint64"), }, { - name: "invalid option type", - args: []interface{}{voterAddr, proposalID, "not-a-uint8", metadata}, - wantErr: true, - errMsg: "invalid option", + name: "invalid option type", + args: []interface{}{voterAddr, proposalID, "not-a-uint8", metadata}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidOption, VoteMethod, fmt.Sprintf(ErrInvalidOption, "not-a-uint8")), }, { - name: "invalid metadata type", - args: []interface{}{voterAddr, proposalID, option, 123}, - wantErr: true, - errMsg: "invalid metadata", + name: "invalid metadata type", + args: []interface{}{voterAddr, proposalID, option, 123}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidMetadata, VoteMethod, fmt.Sprintf(ErrInvalidMetadata, any(123))), }, } @@ -251,8 +250,7 @@ func TestNewMsgVote(t *testing.T) { msg, returnAddr, err := NewMsgVote(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -280,7 +278,7 @@ func TestParseVoteArgs(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantVoter string wantProposalID uint64 }{ @@ -292,28 +290,28 @@ func TestParseVoteArgs(t *testing.T) { wantProposalID: proposalID, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{proposalID, voterAddr, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 3), + name: "too many arguments", + args: []interface{}{proposalID, voterAddr, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(3)), }, { - name: "invalid proposal ID type", - args: []interface{}{"not-a-uint64", voterAddr}, - wantErr: true, - errMsg: "invalid proposal id", + name: "invalid proposal ID type", + args: []interface{}{"not-a-uint64", voterAddr}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, "not-a-uint64"), }, { - name: "invalid voter type", - args: []interface{}{proposalID, "not-an-address"}, - wantErr: true, - errMsg: fmt.Sprintf(ErrInvalidVoter, "not-an-address"), + name: "invalid voter type", + args: []interface{}{proposalID, "not-an-address"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, } @@ -322,8 +320,7 @@ func TestParseVoteArgs(t *testing.T) { req, err := ParseVoteArgs(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, req) } else { require.NoError(t, err) @@ -348,7 +345,7 @@ func TestParseDepositArgs(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDepositor string wantProposalID uint64 }{ @@ -360,28 +357,28 @@ func TestParseDepositArgs(t *testing.T) { wantProposalID: proposalID, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{proposalID, depositorAddr, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 3), + name: "too many arguments", + args: []interface{}{proposalID, depositorAddr, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(3)), }, { - name: "invalid proposal ID type", - args: []interface{}{"not-a-uint64", depositorAddr}, - wantErr: true, - errMsg: "invalid proposal id", + name: "invalid proposal ID type", + args: []interface{}{"not-a-uint64", depositorAddr}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProposalID, "not-a-uint64"), }, { - name: "invalid depositor type", - args: []interface{}{proposalID, "not-an-address"}, - wantErr: true, - errMsg: fmt.Sprintf(ErrInvalidDepositor, "not-an-address"), + name: "invalid depositor type", + args: []interface{}{proposalID, "not-an-address"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, } @@ -390,8 +387,7 @@ func TestParseDepositArgs(t *testing.T) { req, err := ParseDepositArgs(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, req) } else { require.NoError(t, err) diff --git a/precompiles/ics02/ICS02I.sol b/precompiles/ics02/ICS02I.sol index 9ddec82d8..fe2a77265 100644 --- a/precompiles/ics02/ICS02I.sol +++ b/precompiles/ics02/ICS02I.sol @@ -13,7 +13,16 @@ ICS02I constant ICS02_CONTRACT = ICS02I(ICS02_PRECOMPILE_ADDRESS); /// @title ICS02 Client Router Precompile Interface /// @dev The interface through which solidity contracts will interact with IBC Light Clients (ICS02) /// @custom:address 0x0000000000000000000000000000000000000807 -interface ICS02I { +interface ICS02I is IPrecompile { + /// @notice Invalid IBC client identifier (format/encoding). + error InvalidClientID(string clientId); + /// @notice Invalid membership proof bytes. + error InvalidProof(bytes proof); + /// @notice Invalid merkle path argument. + error InvalidPath(bytes[] path); + /// @notice Invalid value bytes argument. + error InvalidValue(bytes value); + /// @notice The result of an update operation enum UpdateResult { /// The update was successful diff --git a/precompiles/ics02/abi.json b/precompiles/ics02/abi.json index 71f457ae8..1fa23e3cb 100644 --- a/precompiles/ics02/abi.json +++ b/precompiles/ics02/abi.json @@ -1,142 +1,348 @@ [ { - "type": "function", - "name": "getClientState", "inputs": [ { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ABISetupFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "eventKind", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EventEmitFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "bad", + "type": "string" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "amount", + "type": "string" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "clientId", + "type": "string" + } + ], + "name": "InvalidClientID", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "height", + "type": "string" + } + ], + "name": "InvalidHeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + } + ], + "name": "InvalidNumberOfArgs", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "path", + "type": "bytes[]" + } + ], + "name": "InvalidPath", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "pubkey", + "type": "string" + } + ], + "name": "InvalidPubkey", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPubkeySize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "InvalidValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msgMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "MsgServerFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "queryMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "QueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + } + ], + "name": "RequesterIsNotMsgSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "methodName", + "type": "string" + } + ], + "name": "UnknownMethod", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", "name": "clientId", - "type": "string", - "internalType": "string" + "type": "string" } ], + "name": "getClientState", "outputs": [ { + "internalType": "bytes", "name": "", - "type": "bytes", - "internalType": "bytes" + "type": "bytes" } ], - "stateMutability": "view" + "stateMutability": "view", + "type": "function" }, { - "type": "function", - "name": "updateClient", "inputs": [ { + "internalType": "string", "name": "clientId", - "type": "string", - "internalType": "string" + "type": "string" }, { + "internalType": "bytes", "name": "updateMsg", - "type": "bytes", - "internalType": "bytes" + "type": "bytes" } ], + "name": "updateClient", "outputs": [ { + "internalType": "enum ICS02I.UpdateResult", "name": "", - "type": "uint8", - "internalType": "enum ICS02I.UpdateResult" + "type": "uint8" } ], - "stateMutability": "nonpayable" + "stateMutability": "nonpayable", + "type": "function" }, { - "type": "function", - "name": "verifyMembership", "inputs": [ { + "internalType": "string", "name": "clientId", - "type": "string", - "internalType": "string" + "type": "string" }, { + "internalType": "bytes", "name": "proof", - "type": "bytes", - "internalType": "bytes" + "type": "bytes" }, { - "name": "proofHeight", - "type": "tuple", - "internalType": "struct Height", "components": [ { + "internalType": "uint64", "name": "revisionNumber", - "type": "uint64", - "internalType": "uint64" + "type": "uint64" }, { + "internalType": "uint64", "name": "revisionHeight", - "type": "uint64", - "internalType": "uint64" + "type": "uint64" } - ] + ], + "internalType": "struct Height", + "name": "proofHeight", + "type": "tuple" }, { + "internalType": "bytes[]", "name": "path", - "type": "bytes[]", - "internalType": "bytes[]" + "type": "bytes[]" }, { + "internalType": "bytes", "name": "value", - "type": "bytes", - "internalType": "bytes" + "type": "bytes" } ], + "name": "verifyMembership", "outputs": [ { + "internalType": "uint256", "name": "", - "type": "uint256", - "internalType": "uint256" + "type": "uint256" } ], - "stateMutability": "nonpayable" + "stateMutability": "nonpayable", + "type": "function" }, { - "type": "function", - "name": "verifyNonMembership", "inputs": [ { + "internalType": "string", "name": "clientId", - "type": "string", - "internalType": "string" + "type": "string" }, { + "internalType": "bytes", "name": "proof", - "type": "bytes", - "internalType": "bytes" + "type": "bytes" }, { - "name": "proofHeight", - "type": "tuple", - "internalType": "struct Height", "components": [ { + "internalType": "uint64", "name": "revisionNumber", - "type": "uint64", - "internalType": "uint64" + "type": "uint64" }, { + "internalType": "uint64", "name": "revisionHeight", - "type": "uint64", - "internalType": "uint64" + "type": "uint64" } - ] + ], + "internalType": "struct Height", + "name": "proofHeight", + "type": "tuple" }, { + "internalType": "bytes[]", "name": "path", - "type": "bytes[]", - "internalType": "bytes[]" + "type": "bytes[]" } ], + "name": "verifyNonMembership", "outputs": [ { + "internalType": "uint256", "name": "", - "type": "uint256", - "internalType": "uint256" + "type": "uint256" } ], - "stateMutability": "nonpayable" + "stateMutability": "nonpayable", + "type": "function" } ] diff --git a/precompiles/ics02/errors.go b/precompiles/ics02/errors.go new file mode 100644 index 000000000..1b0870103 --- /dev/null +++ b/precompiles/ics02/errors.go @@ -0,0 +1,12 @@ +package ics02 + +const ( + // SolidityErrInvalidClientID is defined in ICS02I.sol. + SolidityErrInvalidClientID = "InvalidClientID" + // SolidityErrInvalidProof is defined in ICS02I.sol. + SolidityErrInvalidProof = "InvalidProof" + // SolidityErrInvalidPath is defined in ICS02I.sol. + SolidityErrInvalidPath = "InvalidPath" + // SolidityErrInvalidValue is defined in ICS02I.sol. + SolidityErrInvalidValue = "InvalidValue" +) diff --git a/precompiles/ics02/ics02.go b/precompiles/ics02/ics02.go index f127c9122..c25d4d38d 100644 --- a/precompiles/ics02/ics02.go +++ b/precompiles/ics02/ics02.go @@ -2,7 +2,6 @@ package ics02 import ( "bytes" - "fmt" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -107,7 +106,7 @@ func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Co case GetClientStateMethod: return p.GetClientState(ctx, contract, stateDB, method, args) default: - return nil, fmt.Errorf(cmn.ErrUnknownMethod, method.Name) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrUnknownMethod, method.Name) } } diff --git a/precompiles/ics02/query.go b/precompiles/ics02/query.go index 5f69a249d..a3faa2cff 100644 --- a/precompiles/ics02/query.go +++ b/precompiles/ics02/query.go @@ -8,6 +8,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" + cmn "github.com/cosmos/evm/precompiles/common" ) const ( @@ -30,15 +31,15 @@ func (p *Precompile) GetClientState( clientState, found := p.clientKeeper.GetClientState(ctx, clientID) if !found { - return nil, fmt.Errorf("client state not found for client ID %s", clientID) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetClientStateMethod, fmt.Sprintf("client state not found for client ID %s", clientID)) } clientStateAny, err := codectypes.NewAnyWithValue(clientState) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetClientStateMethod, err.Error()) } if len(clientStateAny.Value) == 0 { - return nil, fmt.Errorf("client state not found for client ID %s", clientID) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetClientStateMethod, fmt.Sprintf("client state not found for client ID %s", clientID)) } return method.Outputs.Pack(clientStateAny.Value) diff --git a/precompiles/ics02/tx.go b/precompiles/ics02/tx.go index edb1f08df..8ead85f6c 100644 --- a/precompiles/ics02/tx.go +++ b/precompiles/ics02/tx.go @@ -1,7 +1,6 @@ package ics02 import ( - "fmt" "math" "math/big" "time" @@ -9,13 +8,12 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" + cmn "github.com/cosmos/evm/precompiles/common" clienttypes "github.com/cosmos/ibc-go/v10/modules/core/02-client/types" commitmenttypesv2 "github.com/cosmos/ibc-go/v10/modules/core/23-commitment/types/v2" host "github.com/cosmos/ibc-go/v10/modules/core/24-host" ibcexported "github.com/cosmos/ibc-go/v10/modules/core/exported" - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -44,24 +42,20 @@ func (p *Precompile) UpdateClient( } if host.ClientIdentifierValidator(clientID) != nil { - return nil, errorsmod.Wrapf( - clienttypes.ErrInvalidClient, - "invalid client ID: %s", - clientID, - ) + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrInvalidClientID, clientID) } clientMsg, err := clienttypes.UnmarshalClientMessage(p.cdc, updateBz) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, UpdateClientMethod, err.Error()) } if err := clientMsg.ValidateBasic(); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, UpdateClientMethod, err.Error()) } if err := p.clientKeeper.UpdateClient(ctx, clientID, clientMsg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, UpdateClientMethod, err.Error()) } if p.clientKeeper.GetClientStatus(ctx, clientID) == ibcexported.Frozen { @@ -85,26 +79,22 @@ func (p *Precompile) VerifyMembership( } if host.ClientIdentifierValidator(clientID) != nil { - return nil, errorsmod.Wrapf( - clienttypes.ErrInvalidClient, - "invalid client ID: %s", - clientID, - ) + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrInvalidClientID, clientID) } path := commitmenttypesv2.NewMerklePath(pathBz...) if err := p.clientKeeper.VerifyMembership(ctx, clientID, proofHeight, 0, 0, proof, path, value); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, VerifyMembershipMethod, err.Error()) } timestampNano, err := p.clientKeeper.GetClientTimestampAtHeight(ctx, clientID, proofHeight) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, VerifyMembershipMethod, err.Error()) } // Convert nanoseconds to seconds without overflow. if timestampNano > math.MaxInt64 { - return nil, fmt.Errorf("timestamp in nanoseconds exceeds int64 max value") + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, VerifyMembershipMethod, "timestamp in nanoseconds exceeds int64 max value") } timestampSeconds := time.Unix(0, int64(timestampNano)).Unix() @@ -125,26 +115,22 @@ func (p *Precompile) VerifyNonMembership( } if host.ClientIdentifierValidator(clientID) != nil { - return nil, errorsmod.Wrapf( - clienttypes.ErrInvalidClient, - "invalid client ID: %s", - clientID, - ) + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrInvalidClientID, clientID) } path := commitmenttypesv2.NewMerklePath(pathBz...) if err := p.clientKeeper.VerifyNonMembership(ctx, clientID, proofHeight, 0, 0, proof, path); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, VerifyNonMembershipMethod, err.Error()) } timestampNano, err := p.clientKeeper.GetClientTimestampAtHeight(ctx, clientID, proofHeight) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, VerifyNonMembershipMethod, err.Error()) } // Convert nanoseconds to seconds without overflow. if timestampNano > math.MaxInt64 { - return nil, fmt.Errorf("timestamp in nanoseconds exceeds int64 max value") + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, VerifyNonMembershipMethod, "timestamp in nanoseconds exceeds int64 max value") } timestampSeconds := time.Unix(0, int64(timestampNano)).Unix() diff --git a/precompiles/ics02/types.go b/precompiles/ics02/types.go index 17065777a..2545f084b 100644 --- a/precompiles/ics02/types.go +++ b/precompiles/ics02/types.go @@ -2,6 +2,7 @@ package ics02 import ( "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi" @@ -18,12 +19,12 @@ type height struct { // ParseGetClientStateArgs parses the arguments for the GetClientState method. func ParseGetClientStateArgs(args []interface{}) (string, error) { if len(args) != 1 { - return "", fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return "", cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } clientID, ok := args[0].(string) if !ok { - return "", fmt.Errorf("invalid client id: %v", args[0]) + return "", cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidClientID, fmt.Sprintf("%v", args[0])) } return clientID, nil @@ -32,16 +33,16 @@ func ParseGetClientStateArgs(args []interface{}) (string, error) { // ParseUpdateClientArgs parses the arguments for the UpdateClient method. func ParseUpdateClientArgs(args []interface{}) (string, []byte, error) { if len(args) != 2 { - return "", nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return "", nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } clientID, ok := args[0].(string) if !ok { - return "", nil, fmt.Errorf("invalid client id: %v", args[0]) + return "", nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidClientID, fmt.Sprintf("%v", args[0])) } updateBytes, ok := args[1].([]byte) if !ok { - return "", nil, fmt.Errorf("invalid update client bytes: %v", args[1]) + return "", nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("invalid update client bytes: %v", args[1])) } return clientID, updateBytes, nil @@ -50,32 +51,32 @@ func ParseUpdateClientArgs(args []interface{}) (string, []byte, error) { // ParseVerifyMembershipArgs parses the arguments for the VerifyMembership method. func ParseVerifyMembershipArgs(method *abi.Method, args []interface{}) (string, []byte, clienttypes.Height, [][]byte, []byte, error) { if len(args) != 5 { - return "", nil, clienttypes.Height{}, nil, nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 5, len(args)) + return "", nil, clienttypes.Height{}, nil, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(5), big.NewInt(int64(len(args)))) } clientID, ok := args[0].(string) if !ok { - return "", nil, clienttypes.Height{}, nil, nil, fmt.Errorf("invalid client id: %v", args[0]) + return "", nil, clienttypes.Height{}, nil, nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidClientID, fmt.Sprintf("%v", args[0])) } proof, ok := args[1].([]byte) if !ok { - return "", nil, clienttypes.Height{}, nil, nil, fmt.Errorf("invalid proof bytes: %v", args[1]) + return "", nil, clienttypes.Height{}, nil, nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProof, []byte{}) } var proofHeight height heightArg := abi.Arguments{method.Inputs[2]} if err := heightArg.Copy(&proofHeight, []interface{}{args[2]}); err != nil { - return "", nil, clienttypes.Height{}, nil, nil, fmt.Errorf("error while unpacking args to TransferInput struct: %s", err) + return "", nil, clienttypes.Height{}, nil, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidHeight, err.Error()) } path, ok := args[3].([][]byte) if !ok { - return "", nil, clienttypes.Height{}, nil, nil, fmt.Errorf("invalid path: %v", args[3]) + return "", nil, clienttypes.Height{}, nil, nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidPath, [][]byte{}) } value, ok := args[4].([]byte) if !ok { - return "", nil, clienttypes.Height{}, nil, nil, fmt.Errorf("invalid value: %v", args[4]) + return "", nil, clienttypes.Height{}, nil, nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidValue, []byte{}) } return clientID, proof, proofHeight.ProofHeight, path, value, nil @@ -84,28 +85,28 @@ func ParseVerifyMembershipArgs(method *abi.Method, args []interface{}) (string, // ParseVerifyNonMembershipArgs parses the arguments for the VerifyNonMembership method. func ParseVerifyNonMembershipArgs(method *abi.Method, args []interface{}) (string, []byte, clienttypes.Height, [][]byte, error) { if len(args) != 4 { - return "", nil, clienttypes.Height{}, nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) + return "", nil, clienttypes.Height{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(int64(len(args)))) } clientID, ok := args[0].(string) if !ok { - return "", nil, clienttypes.Height{}, nil, fmt.Errorf("invalid client id: %v", args[0]) + return "", nil, clienttypes.Height{}, nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidClientID, fmt.Sprintf("%v", args[0])) } proof, ok := args[1].([]byte) if !ok { - return "", nil, clienttypes.Height{}, nil, fmt.Errorf("invalid proof bytes: %v", args[1]) + return "", nil, clienttypes.Height{}, nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidProof, []byte{}) } var proofHeight height heightArg := abi.Arguments{method.Inputs[2]} if err := heightArg.Copy(&proofHeight, []interface{}{args[2]}); err != nil { - return "", nil, clienttypes.Height{}, nil, fmt.Errorf("error while unpacking args to TransferInput struct: %s", err) + return "", nil, clienttypes.Height{}, nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidHeight, err.Error()) } // TODO: make sure path is deserilized like this path, ok := args[3].([][]byte) if !ok { - return "", nil, clienttypes.Height{}, nil, fmt.Errorf("invalid path: %v", args[3]) + return "", nil, clienttypes.Height{}, nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidPath, [][]byte{}) } return clientID, proof, proofHeight.ProofHeight, path, nil diff --git a/precompiles/ics20/ICS20I.sol b/precompiles/ics20/ICS20I.sol index 89f3dbbc7..5c4708a68 100644 --- a/precompiles/ics20/ICS20I.sol +++ b/precompiles/ics20/ICS20I.sol @@ -29,7 +29,22 @@ struct Hop { /// @title ICS20 Transfer Precompiled Contract /// @dev The interface through which solidity contracts will interact with IBC Transfer (ICS20) /// @custom:address 0x0000000000000000000000000000000000000802 -interface ICS20I { +interface ICS20I is IPrecompile { + /// @notice Invalid ICS-20 source port argument. + error InvalidSourcePort(string callMethod, string reason); + /// @notice Invalid ICS-20 source channel (channel ID / client ID) argument. + error InvalidSourceChannel(string callMethod, string reason); + /// @notice Invalid ICS-20 receiver argument. + error InvalidReceiver(string callMethod, string reason); + /// @notice Invalid ICS-20 timeout timestamp argument. + error InvalidTimeoutTimestamp(string callMethod, string reason); + /// @notice Invalid ICS-20 memo argument. + error InvalidMemo(string callMethod, string reason); + /// @notice Invalid denom hash argument. + error InvalidHash(string callMethod, string reason); + /// @notice Invalid denom trace argument. + error InvalidTrace(string callMethod, string reason); + /// @dev Emitted when an ICS-20 transfer is executed. /// @param sender The address of the sender. /// @param receiver The address of the receiver. diff --git a/precompiles/ics20/abi.json b/precompiles/ics20/abi.json index 1fc44348b..382e0fa06 100644 --- a/precompiles/ics20/abi.json +++ b/precompiles/ics20/abi.json @@ -1,4 +1,278 @@ [ + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ABISetupFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "eventKind", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EventEmitFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "bad", + "type": "string" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "amount", + "type": "string" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidHash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "height", + "type": "string" + } + ], + "name": "InvalidHeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidMemo", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + } + ], + "name": "InvalidNumberOfArgs", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "pubkey", + "type": "string" + } + ], + "name": "InvalidPubkey", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPubkeySize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidSourceChannel", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidSourcePort", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidTimeoutTimestamp", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "callMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidTrace", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msgMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "MsgServerFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "queryMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "QueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + } + ], + "name": "RequesterIsNotMsgSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "methodName", + "type": "string" + } + ], + "name": "UnknownMethod", + "type": "error" + }, { "anonymous": false, "inputs": [ diff --git a/precompiles/ics20/errors.go b/precompiles/ics20/errors.go index 605e35ed0..d2482979f 100644 --- a/precompiles/ics20/errors.go +++ b/precompiles/ics20/errors.go @@ -21,4 +21,13 @@ const ( ErrDifferentOriginFromSender = "origin address %s is not the same as sender address %s" // ErrDenomNotFound is raised when the denom for the specified request does not exist. ErrDenomNotFound = "denomination not found" + + // Solidity custom error names defined in ICS20I.sol. + SolidityErrInvalidSourcePort = "InvalidSourcePort" + SolidityErrInvalidSourceChannel = "InvalidSourceChannel" + SolidityErrInvalidReceiver = "InvalidReceiver" + SolidityErrInvalidTimeoutTimestamp = "InvalidTimeoutTimestamp" + SolidityErrInvalidMemo = "InvalidMemo" + SolidityErrInvalidHash = "InvalidHash" + SolidityErrInvalidTrace = "InvalidTrace" ) diff --git a/precompiles/ics20/ics20.go b/precompiles/ics20/ics20.go index 38ff7c3df..2cd133452 100644 --- a/precompiles/ics20/ics20.go +++ b/precompiles/ics20/ics20.go @@ -2,7 +2,6 @@ package ics20 import ( "bytes" - "fmt" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -99,7 +98,7 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]by func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Contract, readOnly bool) ([]byte, error) { method, args, err := cmn.SetupABI(p.ABI, contract, readOnly, p.IsTransaction) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrABISetupFailed, err.Error()) } var bz []byte @@ -116,7 +115,7 @@ func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Co case DenomHashMethod: bz, err = p.DenomHash(ctx, contract, method, args) default: - return nil, fmt.Errorf(cmn.ErrUnknownMethod, method.Name) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrUnknownMethod, method.Name) } return bz, err diff --git a/precompiles/ics20/query.go b/precompiles/ics20/query.go index 819553b15..1bc878ee2 100644 --- a/precompiles/ics20/query.go +++ b/precompiles/ics20/query.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" + cmn "github.com/cosmos/evm/precompiles/common" transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -41,7 +42,7 @@ func (p Precompile) Denom( if strings.Contains(err.Error(), ErrDenomNotFound) { return method.Outputs.Pack(transfertypes.Denom{}) } - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrQueryFailed, DenomMethod, err.Error()) } return method.Outputs.Pack(*res.Denom) @@ -61,7 +62,7 @@ func (p Precompile) Denoms( res, err := p.transferKeeper.Denoms(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrQueryFailed, DenomsMethod, err.Error()) } return method.Outputs.Pack(res.Denoms, res.Pagination) @@ -85,7 +86,7 @@ func (p Precompile) DenomHash( if strings.Contains(err.Error(), ErrDenomNotFound) { return method.Outputs.Pack("") } - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrQueryFailed, DenomHashMethod, err.Error()) } return method.Outputs.Pack(res.Hash) diff --git a/precompiles/ics20/tx.go b/precompiles/ics20/tx.go index 26007e5bd..56753a652 100644 --- a/precompiles/ics20/tx.go +++ b/precompiles/ics20/tx.go @@ -197,26 +197,22 @@ func (p *Precompile) Transfer( // If the channel is in v1 format, check if channel exists and is open if channeltypes.IsChannelIDFormat(msg.SourceChannel) { if err := p.validateV1TransferChannel(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, TransferMethod, err.Error()) } // otherwise, it’s a v2 packet, so perform client ID validation } else if v2ClientIDErr := host.ClientIdentifierValidator(msg.SourceChannel); v2ClientIDErr != nil { - return nil, errorsmod.Wrapf( - channeltypes.ErrInvalidChannel, - "invalid channel ID (%s) on v2 packet", - msg.SourceChannel, - ) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, TransferMethod, v2ClientIDErr.Error()) } msgSender := contract.Caller() if msgSender != sender { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), sender.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, sender) } stateDBExp := stateDB.(*statedb.StateDB) res, err := p.transferWithStateDB(ctx, stateDBExp, msg) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, TransferMethod, err.Error()) } if err = EmitIBCTransferEvent( @@ -231,7 +227,7 @@ func (p *Precompile) Transfer( msg.Token, msg.Memo, ); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, TransferMethod, err.Error()) } return method.Outputs.Pack(res.Sequence) diff --git a/precompiles/ics20/types.go b/precompiles/ics20/types.go index 62b992adc..2b463d296 100644 --- a/precompiles/ics20/types.go +++ b/precompiles/ics20/types.go @@ -1,7 +1,6 @@ package ics20 import ( - "errors" "fmt" "math/big" @@ -13,7 +12,6 @@ import ( transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v10/modules/core/02-client/types" - errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -77,53 +75,53 @@ type height struct { // NewMsgTransfer returns a new transfer message from the given arguments. func NewMsgTransfer(method *abi.Method, args []interface{}) (*transfertypes.MsgTransfer, common.Address, error) { if len(args) != 9 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 9, len(args)) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(9), big.NewInt(int64(len(args)))) } sourcePort, ok := args[0].(string) if !ok { - return nil, common.Address{}, errors.New(ErrInvalidSourcePort) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidSourcePort, TransferMethod, ErrInvalidSourcePort) } sourceChannel, ok := args[1].(string) if !ok { - return nil, common.Address{}, errors.New(ErrInvalidSourceChannel) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidSourceChannel, TransferMethod, ErrInvalidSourceChannel) } denom, ok := args[2].(string) if !ok { - return nil, common.Address{}, errorsmod.Wrapf(transfertypes.ErrInvalidDenomForTransfer, cmn.ErrInvalidDenom, args[2]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[2])) } amount, ok := args[3].(*big.Int) if !ok || amount == nil { - return nil, common.Address{}, errorsmod.Wrapf(transfertypes.ErrInvalidAmount, cmn.ErrInvalidAmount, args[3]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[3])) } sender, ok := args[4].(common.Address) if !ok { - return nil, common.Address{}, fmt.Errorf(ErrInvalidSender, args[4]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[4])) } receiver, ok := args[5].(string) if !ok { - return nil, common.Address{}, fmt.Errorf(ErrInvalidReceiver, args[5]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidReceiver, TransferMethod, fmt.Sprintf(ErrInvalidReceiver, args[5])) } var input height heightArg := abi.Arguments{method.Inputs[6]} if err := heightArg.Copy(&input, []interface{}{args[6]}); err != nil { - return nil, common.Address{}, fmt.Errorf("error while unpacking args to TransferInput struct: %s", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidHeight, err.Error()) } timeoutTimestamp, ok := args[7].(uint64) if !ok { - return nil, common.Address{}, fmt.Errorf(ErrInvalidTimeoutTimestamp, args[7]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidTimeoutTimestamp, TransferMethod, fmt.Sprintf(ErrInvalidTimeoutTimestamp, args[7])) } memo, ok := args[8].(string) if !ok { - return nil, common.Address{}, fmt.Errorf(ErrInvalidMemo, args[8]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidMemo, TransferMethod, fmt.Sprintf(ErrInvalidMemo, args[8])) } // Use instance to prevent errors on denom or amount @@ -134,7 +132,7 @@ func NewMsgTransfer(method *abi.Method, args []interface{}) (*transfertypes.MsgT msg, err := CreateAndValidateMsgTransfer(sourcePort, sourceChannel, token, sdk.AccAddress(sender.Bytes()).String(), receiver, input.TimeoutHeight, timeoutTimestamp, memo) if err != nil { - return nil, common.Address{}, err + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrMsgServerFailed, TransferMethod, err.Error()) } return msg, sender, nil @@ -169,12 +167,12 @@ func CreateAndValidateMsgTransfer( // NewDenomRequest returns a new denom request from the given arguments. func NewDenomRequest(args []interface{}) (*transfertypes.QueryDenomRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf("invalid input arguments. Expected 1, got %d", len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } hash, ok := args[0].(string) if !ok { - return nil, fmt.Errorf(ErrInvalidHash, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidHash, DenomMethod, fmt.Sprintf(ErrInvalidHash, args[0])) } req := &transfertypes.QueryDenomRequest{ @@ -187,12 +185,12 @@ func NewDenomRequest(args []interface{}) (*transfertypes.QueryDenomRequest, erro // NewDenomsRequest returns a new denoms request from the given arguments. func NewDenomsRequest(method *abi.Method, args []interface{}) (*transfertypes.QueryDenomsRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } var pageRequest PageRequest if err := safeCopyInputs(method, args, &pageRequest); err != nil { - return nil, fmt.Errorf("error while unpacking args to PageRequest: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, err.Error()) } req := &transfertypes.QueryDenomsRequest{ @@ -205,12 +203,12 @@ func NewDenomsRequest(method *abi.Method, args []interface{}) (*transfertypes.Qu // NewDenomHashRequest returns a new denom hash request from the given arguments. func NewDenomHashRequest(args []interface{}) (*transfertypes.QueryDenomHashRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf("invalid input arguments. Expected 1, got %d", len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } trace, ok := args[0].(string) if !ok { - return nil, fmt.Errorf("invalid trace") + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidTrace, DenomHashMethod, "invalid trace") } req := &transfertypes.QueryDenomHashRequest{ @@ -225,7 +223,7 @@ func CheckOriginAndSender(contract *vm.Contract, origin common.Address, sender c if contract.Caller() == sender { return sender, nil } else if origin != sender { - return common.Address{}, fmt.Errorf(ErrDifferentOriginFromSender, origin.String(), sender.String()) + return common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf(ErrDifferentOriginFromSender, origin.String(), sender.String())) } return sender, nil } diff --git a/precompiles/slashing/ISlashing.sol b/precompiles/slashing/ISlashing.sol index 4e177b80e..36d63a0be 100644 --- a/precompiles/slashing/ISlashing.sol +++ b/precompiles/slashing/ISlashing.sol @@ -46,7 +46,7 @@ struct Params { /// We follow this same interface including four-byte function selectors, in the precompile that /// wraps the pallet. /// @custom:address 0x0000000000000000000000000000000000000806 -interface ISlashing { +interface ISlashing is IPrecompile { /// @dev Emitted when a validator is unjailed /// @param validator The address of the validator event ValidatorUnjailed(address indexed validator); diff --git a/precompiles/slashing/abi.json b/precompiles/slashing/abi.json index 041866575..c127845b6 100644 --- a/precompiles/slashing/abi.json +++ b/precompiles/slashing/abi.json @@ -1,4 +1,166 @@ [ + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ABISetupFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "eventKind", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EventEmitFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "bad", + "type": "string" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "amount", + "type": "string" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "height", + "type": "string" + } + ], + "name": "InvalidHeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + } + ], + "name": "InvalidNumberOfArgs", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "pubkey", + "type": "string" + } + ], + "name": "InvalidPubkey", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPubkeySize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msgMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "MsgServerFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "queryMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "QueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + } + ], + "name": "RequesterIsNotMsgSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "methodName", + "type": "string" + } + ], + "name": "UnknownMethod", + "type": "error" + }, { "anonymous": false, "inputs": [ diff --git a/precompiles/slashing/errors.go b/precompiles/slashing/errors.go new file mode 100644 index 000000000..44502318d --- /dev/null +++ b/precompiles/slashing/errors.go @@ -0,0 +1,6 @@ +package slashing + +const ( + // SolidityErrSlashingInputInvalid is defined in ISlashing.sol. + SolidityErrSlashingInputInvalid = "SlashingInputInvalid" +) diff --git a/precompiles/slashing/query.go b/precompiles/slashing/query.go index 27eb630be..9bbbdd819 100644 --- a/precompiles/slashing/query.go +++ b/precompiles/slashing/query.go @@ -4,6 +4,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/core/vm" + cmn "github.com/cosmos/evm/precompiles/common" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" ) @@ -34,12 +36,12 @@ func (p *Precompile) GetSigningInfo( res, err := p.slashingKeeper.SigningInfo(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetSigningInfoMethod, err.Error()) } out, err := new(SigningInfoOutput).FromResponse(res) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetSigningInfoMethod, err.Error()) } return method.Outputs.Pack(out.SigningInfo) } @@ -58,12 +60,12 @@ func (p *Precompile) GetSigningInfos( res, err := p.slashingKeeper.SigningInfos(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetSigningInfosMethod, err.Error()) } out, err := new(SigningInfosOutput).FromResponse(res) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetSigningInfosMethod, err.Error()) } return method.Outputs.Pack(out.SigningInfos, out.PageResponse) } @@ -77,7 +79,7 @@ func (p *Precompile) GetParams( ) ([]byte, error) { res, err := p.slashingKeeper.Params(ctx, &types.QueryParamsRequest{}) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, GetParamsMethod, err.Error()) } out := new(ParamsOutput).FromResponse(res) diff --git a/precompiles/slashing/slashing.go b/precompiles/slashing/slashing.go index ac05f779e..5159d81e8 100644 --- a/precompiles/slashing/slashing.go +++ b/precompiles/slashing/slashing.go @@ -2,7 +2,6 @@ package slashing import ( "bytes" - "fmt" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -100,7 +99,7 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]by func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Contract, readOnly bool) ([]byte, error) { method, args, err := cmn.SetupABI(p.ABI, contract, readOnly, p.IsTransaction) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrABISetupFailed, err.Error()) } var bz []byte @@ -117,7 +116,7 @@ func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Co case GetParamsMethod: bz, err = p.GetParams(ctx, method, contract, args) default: - return nil, fmt.Errorf(cmn.ErrUnknownMethod, method.Name) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrUnknownMethod, method.Name) } return bz, err diff --git a/precompiles/slashing/testdata/SlashingCaller.json b/precompiles/slashing/testdata/SlashingCaller.json index 0d528bc7d..e2e9b537f 100644 --- a/precompiles/slashing/testdata/SlashingCaller.json +++ b/precompiles/slashing/testdata/SlashingCaller.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "SlashingCaller", "sourceName": "solidity/precompiles/slashing/testdata/SlashingCaller.sol", "abi": [ @@ -42,8 +42,11 @@ "type": "function" } ], - "bytecode": "0x6080806040523461001657610129908161001c8239f35b600080fdfe6080806040526004361015601257600080fd5b600090813560e01c637327af9014602857600080fd5b3460c8576020918260031936011260c5576004356001600160a01b0381169081900360c85763224f67f360e11b835260048301528282602481846108065af191821560e6578192607f575b50506040519015158152f35b909150823d841160e0575b601f8101601f1916820167ffffffffffffffff81118382101760cc57849183916040528101031260c8575190811515820360c5575038806073565b80fd5b5080fd5b634e487b7160e01b84526041600452602484fd5b503d608a565b50604051903d90823e3d90fdfea264697066735822122030280e24435dd2b28402bc0a014d2529269028fe5e4568d417064696d65217b464736f6c63430008140033", - "deployedBytecode": "0x6080806040526004361015601257600080fd5b600090813560e01c637327af9014602857600080fd5b3460c8576020918260031936011260c5576004356001600160a01b0381169081900360c85763224f67f360e11b835260048301528282602481846108065af191821560e6578192607f575b50506040519015158152f35b909150823d841160e0575b601f8101601f1916820167ffffffffffffffff81118382101760cc57849183916040528101031260c8575190811515820360c5575038806073565b80fd5b5080fd5b634e487b7160e01b84526041600452602484fd5b503d608a565b50604051903d90823e3d90fdfea264697066735822122030280e24435dd2b28402bc0a014d2529269028fe5e4568d417064696d65217b464736f6c63430008140033", + "bytecode": "0x6080806040523460155761011e908161001a8239f35b5f80fdfe60808060405260043610156011575f80fd5b5f3560e01c637327af90146023575f80fd5b3460bf57602036600319011260bf576004356001600160a01b0381169081900360bf5763224f67f360e11b825260048201526020816024815f6108065af1801560dd575f906079575b6020906040519015158152f35b5060203d60201160d7575b601f8101601f1916820167ffffffffffffffff81118382101760c35760209183916040528101031260bf5751801515810360bf57602090606c565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b503d6084565b6040513d5f823e3d90fdfea264697066735822122082996fc9c004eb3406abe512f4bca9ff2a7a3498562f513a525ac8ed3f25a62e64736f6c634300081a0033", + "deployedBytecode": "0x60808060405260043610156011575f80fd5b5f3560e01c637327af90146023575f80fd5b3460bf57602036600319011260bf576004356001600160a01b0381169081900360bf5763224f67f360e11b825260048201526020816024815f6108065af1801560dd575f906079575b6020906040519015158152f35b5060203d60201160d7575b601f8101601f1916820167ffffffffffffffff81118382101760c35760209183916040528101031260bf5751801515810360bf57602090606c565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b503d6084565b6040513d5f823e3d90fdfea264697066735822122082996fc9c004eb3406abe512f4bca9ff2a7a3498562f513a525ac8ed3f25a62e64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/slashing/testdata/SlashingCaller.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/slashing/tx.go b/precompiles/slashing/tx.go index abb21309b..1cab8100b 100644 --- a/precompiles/slashing/tx.go +++ b/precompiles/slashing/tx.go @@ -2,6 +2,7 @@ package slashing import ( "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -29,22 +30,22 @@ func (p Precompile) Unjail( args []interface{}, ) ([]byte, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } validatorAddress, ok := args[0].(common.Address) if !ok { - return nil, fmt.Errorf("invalid validator hex address") + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } msgSender := contract.Caller() if msgSender != validatorAddress { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), validatorAddress.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, validatorAddress) } valAddr, err := p.valCodec.BytesToString(validatorAddress.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to convert validator address: %w", err) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrInvalidAddress, err.Error()) } msg := &types.MsgUnjail{ @@ -52,11 +53,11 @@ func (p Precompile) Unjail( } if _, err := p.slashingMsgServer.Unjail(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, UnjailMethod, err.Error()) } if err := p.EmitValidatorUnjailedEvent(ctx, stateDB, validatorAddress); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, UnjailMethod, err.Error()) } return method.Outputs.Pack(true) diff --git a/precompiles/slashing/types.go b/precompiles/slashing/types.go index e5edf07e1..bb829abc8 100644 --- a/precompiles/slashing/types.go +++ b/precompiles/slashing/types.go @@ -2,6 +2,7 @@ package slashing import ( "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -45,17 +46,17 @@ type SigningInfosInput struct { // ParseSigningInfoArgs parses the arguments for the signing info query func ParseSigningInfoArgs(args []interface{}, consCodec address.Codec) (*slashingtypes.QuerySigningInfoRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } hexAddr, ok := args[0].(common.Address) if !ok || hexAddr == (common.Address{}) { - return nil, fmt.Errorf("invalid consensus address") + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } consAddr, err := consCodec.BytesToString(hexAddr.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to convert consensus address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } return &slashingtypes.QuerySigningInfoRequest{ @@ -66,12 +67,12 @@ func ParseSigningInfoArgs(args []interface{}, consCodec address.Codec) (*slashin // ParseSigningInfosArgs parses the arguments for the signing infos query func ParseSigningInfosArgs(method *abi.Method, args []interface{}) (*slashingtypes.QuerySigningInfosRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } var input SigningInfosInput if err := method.Inputs.Copy(&input, args); err != nil { - return nil, fmt.Errorf("error while unpacking args to SigningInfosInput: %s", err) + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrSlashingInputInvalid, GetSigningInfosMethod, err.Error()) } return &slashingtypes.QuerySigningInfosRequest{ @@ -82,7 +83,7 @@ func ParseSigningInfosArgs(method *abi.Method, args []interface{}) (*slashingtyp func (sio *SigningInfoOutput) FromResponse(res *slashingtypes.QuerySigningInfoResponse) (*SigningInfoOutput, error) { consAddr, err := types.ConsAddressFromBech32(res.ValSigningInfo.Address) if err != nil { - return nil, fmt.Errorf("error parsing consensus address: %w", err) + return nil, err } sio.SigningInfo = SigningInfo{ @@ -101,7 +102,7 @@ func (sio *SigningInfosOutput) FromResponse(res *slashingtypes.QuerySigningInfos for i, info := range res.Info { consAddr, err := types.ConsAddressFromBech32(info.Address) if err != nil { - return nil, fmt.Errorf("error parsing consensus address: %w", err) + return nil, err } sio.SigningInfos[i] = SigningInfo{ ValidatorAddress: common.BytesToAddress(consAddr.Bytes()), diff --git a/precompiles/slashing/types_test.go b/precompiles/slashing/types_test.go index 7acb99efe..679d71c0b 100644 --- a/precompiles/slashing/types_test.go +++ b/precompiles/slashing/types_test.go @@ -1,7 +1,7 @@ package slashing import ( - "fmt" + "math/big" "testing" "github.com/ethereum/go-ethereum/common" @@ -9,6 +9,7 @@ import ( evmaddress "github.com/cosmos/evm/encoding/address" cmn "github.com/cosmos/evm/precompiles/common" + "github.com/cosmos/evm/precompiles/testutil" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -23,7 +24,7 @@ func TestParseSigningInfoArgs(t *testing.T) { name string args []any wantErr bool - errMsg string + wantErrObj error wantConsAddress string }{ { @@ -33,40 +34,40 @@ func TestParseSigningInfoArgs(t *testing.T) { wantConsAddress: expectedConsAddr, }, { - name: "no arguments", - args: []any{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + name: "no arguments", + args: []any{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { - name: "too many arguments", - args: []any{validAddr, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 2), + name: "too many arguments", + args: []any{validAddr, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(2)), }, { - name: "invalid type - string instead of address", - args: []any{"not-an-address"}, - wantErr: true, - errMsg: "invalid consensus address", + name: "invalid type - string instead of address", + args: []any{"not-an-address"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "invalid type - nil", - args: []any{nil}, - wantErr: true, - errMsg: "invalid consensus address", + name: "invalid type - nil", + args: []any{nil}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, ""), }, { - name: "empty address", - args: []any{common.Address{}}, - wantErr: true, - errMsg: "invalid consensus address", + name: "empty address", + args: []any{common.Address{}}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid type - integer", - args: []any{12345}, - wantErr: true, - errMsg: "invalid consensus address", + name: "invalid type - integer", + args: []any{12345}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "12345"), }, } @@ -75,8 +76,7 @@ func TestParseSigningInfoArgs(t *testing.T) { got, err := ParseSigningInfoArgs(tt.args, consCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, got) } else { require.NoError(t, err) diff --git a/precompiles/staking/StakingI.sol b/precompiles/staking/StakingI.sol index 3c55d0d9f..285b5b299 100644 --- a/precompiles/staking/StakingI.sol +++ b/precompiles/staking/StakingI.sol @@ -2,7 +2,6 @@ pragma solidity >=0.8.17; import "../common/Types.sol"; - /// @dev The StakingI contract's address. address constant STAKING_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000800; @@ -129,7 +128,15 @@ enum BondStatus { /// We follow this same interface including four-byte function selectors, in the precompile that /// wraps the pallet. /// @custom:address 0x0000000000000000000000000000000000000800 -interface StakingI { +interface StakingI is IPrecompile { + /// @notice Precompile-defined errors (ABI-encoded revert data for clients). + error BondDenomQueryFailed(string reason); + error CannotCallFromContract(address msgSender, uint256 codeLength, bool delegated); + error InvalidDescription(string value); + error InvalidCommission(string value); + error RedelegationsInputUnpackFailed(string reason); + error InvalidRedelegationsQuery(string reason); + /// @dev Defines a method for creating a new validator. /// @param description The initial description /// @param commissionRates The initial commissionRates diff --git a/precompiles/staking/abi.json b/precompiles/staking/abi.json index 7871943da..bfe2d3345 100644 --- a/precompiles/staking/abi.json +++ b/precompiles/staking/abi.json @@ -1,4 +1,242 @@ [ + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ABISetupFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "BondDenomQueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "codeLength", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegated", + "type": "bool" + } + ], + "name": "CannotCallFromContract", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "eventKind", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EventEmitFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "bad", + "type": "string" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "amount", + "type": "string" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "value", + "type": "string" + } + ], + "name": "InvalidCommission", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "value", + "type": "string" + } + ], + "name": "InvalidDescription", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "height", + "type": "string" + } + ], + "name": "InvalidHeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + } + ], + "name": "InvalidNumberOfArgs", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "pubkey", + "type": "string" + } + ], + "name": "InvalidPubkey", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPubkeySize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "InvalidRedelegationsQuery", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msgMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "MsgServerFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "queryMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "QueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "RedelegationsInputUnpackFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + } + ], + "name": "RequesterIsNotMsgSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "methodName", + "type": "string" + } + ], + "name": "UnknownMethod", + "type": "error" + }, { "anonymous": false, "inputs": [ diff --git a/precompiles/staking/errors.go b/precompiles/staking/errors.go index 822545bdf..c04f4e5ae 100644 --- a/precompiles/staking/errors.go +++ b/precompiles/staking/errors.go @@ -3,8 +3,14 @@ package staking const ( // ErrNoDelegationFound is raised when no delegation is found for the given delegator and validator addresses. ErrNoDelegationFound = "delegation with delegator %s not found for validator %s" - // ErrDifferentOriginFromValidator is raised when the origin address is not the same as the validator address. - ErrDifferentOriginFromValidator = "origin address %s is not the same as validator operator address %s" // ErrCannotCallFromContract is raised when a function cannot be called from a smart contract. ErrCannotCallFromContract = "this method can only be called directly to the precompile, not from a smart contract" + + // Solidity custom error names defined in StakingI (and IPrecompile where shared). + SolidityErrBondDenomQueryFailed = "BondDenomQueryFailed" + SolidityErrCannotCallFromContract = "CannotCallFromContract" + SolidityErrInvalidDescription = "InvalidDescription" + SolidityErrInvalidCommission = "InvalidCommission" + SolidityErrRedelegationsInputUnpackFailed = "RedelegationsInputUnpackFailed" + SolidityErrInvalidRedelegationsQuery = "InvalidRedelegationsQuery" ) diff --git a/precompiles/staking/query.go b/precompiles/staking/query.go index 35da3a7fe..9124fd94e 100644 --- a/precompiles/staking/query.go +++ b/precompiles/staking/query.go @@ -52,12 +52,12 @@ func (p Precompile) Delegation( if strings.Contains(err.Error(), fmt.Sprintf(ErrNoDelegationFound, req.DelegatorAddr, req.ValidatorAddr)) { bondDenom, err := p.stakingKeeper.BondDenom(ctx) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrBondDenomQueryFailed, err.Error()) } return method.Outputs.Pack(big.NewInt(0), cmn.Coin{Denom: bondDenom, Amount: big.NewInt(0)}) } - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, DelegationMethod, err.Error()) } out := new(DelegationOutput).FromResponse(res) @@ -85,7 +85,7 @@ func (p Precompile) UnbondingDelegation( if strings.Contains(err.Error(), expError) { return method.Outputs.Pack(UnbondingDelegationResponse{}) } - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, UnbondingDelegationMethod, err.Error()) } out := new(UnbondingDelegationOutput).FromResponse(res) @@ -112,7 +112,7 @@ func (p Precompile) Validator( if strings.Contains(err.Error(), expError) { return method.Outputs.Pack(DefaultValidatorInfo()) } - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ValidatorMethod, err.Error()) } validatorInfo := NewValidatorInfoFromResponse(res.Validator) @@ -134,7 +134,7 @@ func (p Precompile) Validators( res, err := p.stakingQuerier.Validators(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, ValidatorsMethod, err.Error()) } out := new(ValidatorsOutput).FromResponse(res) @@ -178,7 +178,7 @@ func (p Precompile) Redelegations( res, err := p.stakingQuerier.Redelegations(ctx, req) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrQueryFailed, RedelegationsMethod, err.Error()) } out := new(RedelegationsOutput).FromResponse(res) diff --git a/precompiles/staking/staking.go b/precompiles/staking/staking.go index ac32f9623..da8dd6b0e 100644 --- a/precompiles/staking/staking.go +++ b/precompiles/staking/staking.go @@ -2,7 +2,6 @@ package staking import ( "bytes" - "fmt" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -101,7 +100,7 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]by func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Contract, readOnly bool) ([]byte, error) { method, args, err := cmn.SetupABI(p.ABI, contract, readOnly, p.IsTransaction) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrABISetupFailed, err.Error()) } var bz []byte @@ -134,7 +133,7 @@ func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Co case RedelegationsMethod: bz, err = p.Redelegations(ctx, method, contract, args) default: - return nil, fmt.Errorf(cmn.ErrUnknownMethod, method.Name) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrUnknownMethod, method.Name) } return bz, err diff --git a/precompiles/staking/testdata/StakingCaller.json b/precompiles/staking/testdata/StakingCaller.json index adb465da0..0f898a1d7 100644 --- a/precompiles/staking/testdata/StakingCaller.json +++ b/precompiles/staking/testdata/StakingCaller.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "StakingCaller", "sourceName": "solidity/precompiles/staking/testdata/StakingCaller.sol", "abi": [ @@ -1034,8 +1034,11 @@ "type": "function" } ], - "bytecode": "0x60803462000266576020906001600160401b0381830181811183821017620002505760808301818110838211176200025057604052602381527f2f636f736d6f732e7374616b696e672e763162657461312e4d736744656c656760408401526261746560e81b60608401528252600390815492600193848455808510620001d1575b5060008381528581209095869390925b868510620000a9576040516130a69081620002c28239f35b8051908151838111620001bd5788918691620000c687546200026b565b948c601f968588821162000182575b5050508c849683116001146200011c5795829186979262000110575b5050600019828c1b1c191690841b1786555b0193019401939162000091565b015190503880620000f1565b9095601f198316898352858320925b8181106200016a575090869784889594931062000151575b505050811b01865562000103565b0151600019838e1b60f8161c1916905538808062000143565b8289015184558e978c9794019392830192016200012b565b828b620001aa945220600589808701821c830193898810620001b3575b01901c0190620002a8565b8c3885620000d5565b935082936200019f565b634e487b7160e01b8a52604160045260248afd5b6000848152858088832093840193015b838110620001f25750505062000081565b82620001ff82546200026b565b8062000211575b5050018690620001e1565b601f8082116001146200022b57505081555b823862000206565b62000246908484528c8420920160051c8201858301620002a8565b8183555562000223565b634e487b7160e01b600052604160045260246000fd5b600080fd5b90600182811c921680156200029d575b60208310146200028757565b634e487b7160e01b600052602260045260246000fd5b91607f16916200027b565b818110620002b4575050565b60008155600101620002a856fe6080604052600436101561001257600080fd5b60003560e01c8063088b32b1146101575780631904bb2e1461015257806319b16c4c1461014d5780632345e7d41461014857806329e71c821461014357806331bcbcb31461013e578063455b855114610139578063464d2d0314610134578063569c21e31461012f578063570467ac1461012a57806361bc221a1461012557806368ac3df314610120578063a4603a2e1461011b578063af9a90b214610116578063b13d424214610111578063b3e982341461010c578063b61b519714610107578063cf2753cf14610102578063ddbaf2c2146100fd5763f732b065146100f857600080fd5b611c2d565b611ab9565b611a1e565b6119af565b6118b5565b611773565b61160f565b6114ae565b611427565b6113fb565b611338565b61121d565b6111a2565b610f9f565b610d97565b610c97565b610a6d565b6107ec565b6105b2565b6103dc565b600435906001600160a01b038216820361017257565b600080fd5b60a435906001600160a01b038216820361017257565b602435906001600160a01b038216820361017257565b80548210156101bf5760005260206000209060021b0190600090565b634e487b7160e01b600052603260045260246000fd5b90600182811c92168015610205575b60208310146101ef57565b634e487b7160e01b600052602260045260246000fd5b91607f16916101e4565b634e487b7160e01b600052604160045260246000fd5b61016081019081106001600160401b0382111761024157604052565b61020f565b60a081019081106001600160401b0382111761024157604052565b606081019081106001600160401b0382111761024157604052565b60c081019081106001600160401b0382111761024157604052565b608081019081106001600160401b0382111761024157604052565b604081019081106001600160401b0382111761024157604052565b90601f801991011681019081106001600160401b0382111761024157604052565b9060405191826000825492610302846101d5565b908184526001948581169081600014610371575060011461032e575b505061032c925003836102cd565b565b9093915060005260209081600020936000915b81831061035957505061032c9350820101388061031e565b85548884018501529485019487945091830191610341565b91505061032c94506020925060ff191682840152151560051b820101388061031e565b60005b8381106103a75750506000910152565b8181015183820152602001610397565b906020916103d081518092818552858086019101610394565b601f01601f1916010190565b34610172576040366003190112610172576103f561015c565b6001600160a01b03166000908152600160205260409020805460243591908210156101725761045a91610427916101a3565b50610431816102ee565b906001810154906003600282015491015460070b906040519485946080865260808601906103b7565b926020850152604084015260608301520390f35b90600482101561047b5752565b634e487b7160e01b600052602160045260246000fd5b6104fa9160806104e96104d76104c56104b3865160a0875260a08701906103b7565b602087015186820360208801526103b7565b604086015185820360408701526103b7565b606085015184820360608601526103b7565b9201519060808184039101526103b7565b90565b9061056d61052961051784516101608086528501906103b7565b602085015184820360208601526103b7565b6040848101511515908401526105476060850151606085019061046e565b6080840151608084015260a084015160a084015260c084015183820360c0850152610491565b60e08084015160070b90830152916101008181015160070b9083015261012080820151908301526101408091015191015290565b9060206104fa9281815201906104fd565b34610172576020366003190112610172576101406106766105d161015c565b6040908151906105e082610225565b60608083528060208401526000958387949285878195015283818301528360808301528360a083015286519061061582610246565b80825260208201819052878201819052818101819052608082015260c082015260e08101839052610100810183905261012081018390520152825163111d9dbd60e11b81526001600160a01b03909116600482015292839081906024820190565b03816108005afa9182156106c4578361069b949361069f575b505051918291826105a1565b0390f35b6106bc9293503d8091833e6106b481836102cd565b8101906128d8565b90388061068f565b611e38565b6040519061032c826102b2565b6040519061032c82610246565b6040519061032c82610225565b6040519061032c82610297565b6001600160401b03811161024157601f01601f191660200190565b929192610724826106fd565b9161073260405193846102cd565b829481845281830111610172578281602093846000960137010152565b9080601f83011215610172578160206104fa93359101610718565b6060600319820112610172576004356001600160a01b038116810361017257916001600160401b0360243581811161017257836107a99160040161074f565b92604435918211610172576104fa9160040161074f565b90815260406020820152606060206107e3845160408086015260808501906103b7565b93015191015290565b34610172576107fa3661076a565b60009291926108076128fd565b506040938451916020948584019463120bba7360e11b86528461082e858460248401612a97565b0390610842601f19928381018852876102cd565b8851610861816108558b82018095611aa2565b038481018352826102cd565b5190209088518881019061088c8161085584600c906b19195b1959d85d1958d85b1b60a21b81520190565b51902082036108db575050505050916000806108cd9361069b969551906108005af4906108c06108ba612edf565b92612fa3565b8082518301019101612a37565b9290915b51928392836107c0565b8851691cdd185d1a58d8d85b1b60b21b898201908152906108ff81600a8401610855565b519020820361093b575050505050916000806109339361069b969551906108005afa906108c061092d612edf565b92612f57565b9290916108d1565b88516318d85b1b60e21b898201908152906109598160048401610855565b519020820361098e575050505050916000806109339361069b96955190826108005af1906108c0610988612edf565b92612f0f565b9193955091935086516109c487820192826109b8856008906763616c6c636f646560c01b81520190565b039081018352826102cd565b51902003610a515760a460c0926109ef6109dc612ff9565b8051908801206001600160e01b03191690565b908787870151960151885196879586948552600485015289602485015260336044850152606484015260848301526108005af291815192610100606084015193018552156101725761069b91610a436106c9565b9160608352820152926108d1565b845162461bcd60e51b815280610a6960048201612eb4565b0390fd5b34610172576060366003190112610172576001600160401b0360043581811161017257610a9e90369060040161074f565b6024359160443590811161017257610aba90369060040161074f565b91610ac3612075565b6040805160209485820192630fb6accf60e21b845282610ae886883060248501611eeb565b0391610afc601f19938481018652856102cd565b8151610b1b81610b0f8b82018095611aa2565b038581018352826102cd565b519020610b30610b2a42611f69565b60070b90565b92825189810190610b588161085584600c906b19195b1959d85d1958d85b1b60a21b81520190565b5190208203610b99575050505093600080610b9193610b979751906108005af490610b846108ba612edf565b80825183010191016121ac565b91612205565b005b8251691cdd185d1a58d8d85b1b60b21b8a820190815290610bbd81600a8401610855565b5190208203610be9575050505093600080610b9193610b979751906108005afa90610b8461092d612edf565b82516318d85b1b60e21b8a820190815290610c078160048401610855565b5190208203610c34575050505093600080610b9193610b97975190826108005af190610b84610988612edf565b9091929697610c5c845191820192826109b8856008906763616c6c636f646560c01b81520190565b51902003610c80575060009182915190826108005af21561017257610b9792612205565b5162461bcd60e51b815280610a6960048201612eb4565b34610172576040366003190112610172576004356001600160401b03811161017257610cc790369060040161074f565b602435610cd48183612377565b610cdc612075565b604051630fb6accf60e21b81529060208280610cfd84873060048501611eeb565b038160006108005af19182156106c457600092610d67575b5060008260070b1315610d2b57610b9792612205565b60405162461bcd60e51b81526020600482015260146024820152734661696c656420746f20756e64656c656761746560601b6044820152606490fd5b610d8991925060203d8111610d90575b610d8181836102cd565b8101906121ac565b9038610d15565b503d610d77565b606036600319011261017257610dab61015c565b6024356001600160401b03811161017257610dca90369060040161074f565b610dd2612075565b60405163a9059cbb60e01b6020820190815233602483015260448035818401528252610e1d91610e036064826102cd565b600094859283809351925af1610e17612edf565b50613032565b6040516353266bbb60e01b81529060208280610e3e34853060048501611eeb565b0381866108005af19182156106c457610e6a92610e62918591610e6d575b50611f15565b349033611f79565b80f35b610e8e915060203d8111610e94575b610e8681836102cd565b810190611d3c565b38610e5c565b503d610e7c565b906040600319830112610172576004356001600160a01b03811681036101725791602435906001600160401b038211610172576104fa9160040161074f565b906020908183528051916060928382860152610efb608091828701906103b7565b93828401519581601f1997610f1c60409889928b86830301848701526103b7565b96015197828703019101528280875195868152019601946000925b858410610f48575050505050505090565b86518051600790810b8a5281870151810b8a880152818401518a850152818501518a860152818301516001600160401b03168a84015260a091820151900b9089015260c09097019695840195600190930192610f37565b3461017257610fad36610e9b565b906040805191610fbc83610261565b60609384845284836020958287820152015282519163a03ffee160e01b83528280610fee600094859460048401612a97565b03816108005afa9384156106c4578194611010575b83518061069b8782610eda565b90919293503d8083853e61102481856102cd565b83019080848303126111685783516001600160401b0394858211611170570193868584031261116c5785519461105986610261565b8051828111611174578461106e918301612725565b8652828101518281116111745784611087918301612725565b838701528681015191821161117057019180601f8401121561116c578251966110af88612917565b946110bc885196876102cd565b888652838601928460c0809b0287010195818711611168578501935b8685106110f8575050505050505061069b93508282015290388080611003565b8a8583031261116857858b918b5161110f8161027c565b6111188861219e565b815261112583890161219e565b838201528c8801518d82015286880151878201526080808901519061114982611b07565b82015260a0611159818a0161219e565b908201528152019401936110d8565b8280fd5b8380fd5b8480fd5b8580fd5b602060031982011261017257600435906001600160401b038211610172576104fa9160040161074f565b6111ab36611178565b6111b3612075565b6040516353266bbb60e01b8152806111d034843060048501611eeb565b039160208260009481866108005af19182156106c4576111fa92610e62918591610e6d5750611f15565b80803415611214575b8180809234903390f1156106c45780f35b506108fc611203565b61122636611178565b61122e612075565b6040516353266bbb60e01b8152906020828061124f34853060048501611eeb565b038160006108005af19182156106c457610b9792610e6291600091610e6d5750611f15565b805190611289608092838552838501906103b7565b60606112b66112a460209384860151888203868a01526103b7565b604085015187820360408901526103b7565b9201519360608184039101528080855193848152019401926000905b8382106112e157505050505090565b909192939483828261131a6001948a5160608091805160070b8452602081015160070b6020850152604081015160408501520151910152565b01960194939201906112d2565b9060206104fa928181520190611274565b346101725760006113483661076a565b9092916113b46040519261135b84610297565b606080858180975281602082015281604082015201526113a26040519687958695631f67e4e760e21b875260018060a01b03166004870152602486015260648501906103b7565b838103600319016044850152906103b7565b03816108005afa80156106c45761069b916000916113da575b5060405191829182611327565b6113f5913d8091833e6113ed81836102cd565b810190612bfa565b386113cd565b34610172576000366003190112610172576020600254604051908152f35b908160a09103126101725790565b3461017257610100366003190112610172576001600160401b0360043581811161017257611459903690600401611419565b9060603660231901126101725761146e610177565b9160c4359182116101725761069b9261148e61149c93369060040161074f565b9060e4359260843590611e44565b60405190151581529081906020820190565b34610172576060366003190112610172576004356001600160401b038111610172576114de90369060040161074f565b604435906024356114ed612075565b600091825b33600052846001806020526040600020548310156115fb573360009081526001602052604090206115249084906101a3565b5061154585611532836102ee565b6020815191012090602081519101201490565b90816115e2575b5061156157505061155c90611fbf565b6114f2565b84955060209391949250600161157a915b151514612698565b611599604051968793849363096ac6ff60e11b8552306004860161252a565b038160006108005af19283156106c457610b97936115bf916000916115c4575b5061255d565b6125a9565b6115dc915060203d8111610e9457610e8681836102cd565b386115b9565b600301546115f3915060070b610b2a565b42103861154c565b5092938491509161157a6001602094611572565b34610172576080366003190112610172576004356001600160401b0381116101725761163f903690600401611419565b602061167061164c61018d565b604051632943c16b60e21b8152608060048201529384928392916084840190611da3565b6001600160a01b03909116602483015260448035908301526064803590830152038160006108005af180156106c45761069b916000916116be575b5060405190151581529081906020820190565b6116d6915060203d8111610e9457610e8681836102cd565b386116ab565b9060206001600160401b03816116fb85516040865260408601906103b7565b9401511691015290565b929160408401916040855280518093526060850160608460051b870101936020809301916000905b8282106117495750505050936104fa93948184039101526116dc565b909192958480611765600193605f198d82030186528a516104fd565b98019201920190929161172d565b346101725760406003198181360112610172576001600160401b03600435818111610172576117a690369060040161074f565b60243590828211610172576000926117c56117f3933690600401611419565b946117ce6128fd565b506080808851978896879663186b216760e01b88528b600489015260448801906103b7565b9386850301602487015261181861180a8280611d51565b60a0875260a0870191611d82565b9480602083013561182881611b07565b1660208601528a82013561183b81611b07565b168a850152606081013561184e81611b23565b15156060850152013561186081611b23565b151591015203816108005afa9182156106c457600091829361188c575b5061069b905192839283611705565b6118ad91935061069b923d8091833e6118a581836102cd565b81019061298d565b92909161187d565b3461017257600319606036820112610172576001600160401b0390600435828111610172576118e890369060040161074f565b916024359081116101725761190190369060040161074f565b61194f6020604435936119148587612377565b604051809381926354b826f560e01b83523060048401526080602484015261193f608484018a6103b7565b90838203016044840152866103b7565b866064830152038160006108005af19081156106c457610b9794611985600061198b9487948291611991575b5060070b13612419565b3361245c565b33611f79565b6119a9915060203d8111610d9057610d8181836102cd565b3861197b565b6119b836611178565b6119c0612075565b6040516353266bbb60e01b815290602082806119e134853060048501611eeb565b038160006108005af19182156106c457611a0692610e6291600091610e6d5750611f15565b60025460018101809111611a1957600255005b611f53565b3461017257611a566000611a3136610e9b565b90611a3a6128fd565b5060405163120bba7360e11b8152938492839260048401612a97565b03816108005afa9081156106c4576000908192611a7e575b5061069b604051928392836107c0565b90611a9b92503d8091833e611a9381836102cd565b810190612a37565b9038611a6e565b90611ab560209282815194859201610394565b0190565b34610172576020611af581611acd36610e9b565b9060018060a01b03166000526000825260406000208260405194838680955193849201610394565b82019081520301902054604051908152f35b6001600160401b0381160361017257565b359061032c82611b07565b8015150361017257565b359061032c82611b23565b92916040918285018386528151809152606086019060608160051b88010194602080940192600091825b848410611b8057505050505050936104fa93948184039101526116dc565b9091929394978690605f198c8203018552895182611ba5825187855287850190611274565b910151918381830391015282808351928381520192019084905b808210611bde5750505090806001929a01940194019294939190611b62565b919360a060019294828751611c1883825160608091805160070b8452602081015160070b6020850152604081015160408501520151910152565b01516080820152019401920189939291611bbf565b346101725760031960803682011261017257611c4761015c565b6001600160401b039060243582811161017257611c6890369060040161074f565b60443583811161017257611c8090369060040161074f565b91606435948486116101725760a09086360301126101725760405193611ca585610246565b85600401359081116101725785019436602387011215610172576084611d1791611cdc611d21983690602460048201359101610718565b8752611cea60248201611b18565b6020880152611cfb60448201611b18565b6040880152611d0c60648201611b2d565b606088015201611b2d565b6080850152612dc6565b9061069b60405192839283611b38565b519061032c82611b23565b9081602091031261017257516104fa81611b23565b9035601e19823603018112156101725701602081359101916001600160401b03821161017257813603831361017257565b908060209392818452848401376000828201840152601f01601f1916010190565b6104fa91611e2a611e1f611e04611de9611dce611dc08780611d51565b60a0885260a0880191611d82565b611ddb6020880188611d51565b908783036020890152611d82565b611df66040870187611d51565b908683036040880152611d82565b611e116060860186611d51565b908583036060870152611d82565b926080810190611d51565b916080818503910152611d82565b6040513d6000823e3d90fd5b9093611eb2611e7693956020956040519788968796637be6aa8b60e11b88526101006004890152610104880190611da3565b92602435602488015260443560448801526064356064880152608487015260018060a01b031660a48601526003198583030160c48601526103b7565b9060e4830152038160006108005af19081156106c457600091611ed3575090565b6104fa915060203d8111610e9457610e8681836102cd565b939291611f109060409260018060a01b031686526060602087015260608601906103b7565b930152565b15611f1c57565b60405162461bcd60e51b815260206004820152600f60248201526e19195b1959d85d194819985a5b1959608a1b6044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b90621baf808201809211611a1957565b611fa79160209160018060a01b03166000526000825260406000208260405194838680955193849201610394565b8201908152030190208054918201809211611a195755565b6000198114611a195760010190565b818110611fd9575050565b60008155600101611fce565b634e487b7160e01b600052600060045260246000fd5b906120635760038161200f600093546101d5565b80612026575b508260018201558260028201550155565b601f811160011461203c57508281555b38612015565b839082825261205a601f60208420920160051c820160018301611fce565b81835555612036565b611fe5565b91908203918211611a1957565b60005b336000526001602090808252604091826000208054851015612197578461209e916101a3565b509142600384015460070b11156120c2575b505050506120bd90611fbf565b612078565b3360009081526001602052604090206120e6906120e09087906101a3565b90611ffb565b828101543360009081526020819052604090209094519360009281549161210c836101d5565b9282811690811561217c5750600114612146575b505050815282900301902080546120bd939261213b91612068565b9055903880806120b0565b600090815285812093945091925b83831061216b5750505083019083816120bd612120565b805487840152918501918101612154565b60ff19168852505050801515028401915083816120bd612120565b5050505050565b51908160070b820361017257565b90816020910312610172576104fa9061219e565b9190601f81116121cf57505050565b61032c926000526020600020906020601f840160051c830193106121fb575b601f0160051c0190611fce565b90915081906121ee565b91903360005260016020918183526040600020926040519561222687610297565b86528086019182526040860193438552606087019560070b86528054600160401b8110156102415761225c9185820181556101a3565b9690966120635751908151916001600160401b0383116102415761228a836122848a546101d5565b8a6121c0565b81601f84116001146122fd57509282600396936122d4969361032c9a99966000926122f2575b505060001982891b1c191690831b1787555b51908601555160028501555160070b90565b9101906001600160401b0319825416906001600160401b0316179055565b0151905038806122b0565b9190601f1984166123138a600052602060002090565b936000905b82821061236057505093869361032c9a9996936122d498938360039b9810612348575b505050811b0187556122c2565b0151600019838b1b60f8161c1916905538808061233b565b808986978294978701518155019601940190612318565b602061239d91336000526000825260406000208260405194838680955193849201610394565b82019081520301902054106123ae57565b60405162461bcd60e51b815260206004820152603b60248201527f44656c65676174696f6e20646f6573206e6f74206578697374206f7220696e7360448201527f756666696369656e742064656c65676174696f6e20616d6f756e7400000000006064820152608490fd5b1561242057565b60405162461bcd60e51b81526020600482015260146024820152734661696c656420746f20726564656c656761746560601b6044820152606490fd5b9060018060a01b0382166000526000602052604060002091836040516020818551968287019761248d81848b610394565b82019081520301902054106124e5576001600160a01b03166000908152602081815260409091206124e1936124d093909190604051948593849251928391610394565b820190815203019020918254612068565b9055565b60405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742064656c65676174696f6e20616d6f756e7400006044820152606490fd5b6001600160a01b03909116815260806020820181905292949392606092612553918301906103b7565b9460408201520152565b1561256457565b60405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f2063616e63656c20756e626f6e64696e670000000000006044820152606490fd5b3360005260019160209083825260408481600020946000965b6125d0575b50505050505050565b8554871015612693576125e387876101a3565b509080600283015403612681575001928354918383106126305750509061260991612068565b8091551561261c575b80808080806125c7565b612629916120e0916101a3565b3880612612565b60849250519062461bcd60e51b82526004820152602560248201527f616d6f756e74206578636565647320756e626f6e64696e6720656e74727920616044820152641b5bdd5b9d60da1b6064820152fd5b905061268d8297611fbf565b966125c2565b6125c7565b1561269f57565b60405162461bcd60e51b815260206004820152602360248201527f556e626f6e64696e672064656c65676174696f6e20646f6573206e6f742065786044820152621a5cdd60ea1b6064820152608490fd5b909291926126fd816106fd565b9161270b60405193846102cd565b82948284528282011161017257602061032c930190610394565b9080601f830112156101725781516104fa926020016126f0565b5190600482101561017257565b91909160a081840312610172576127616106d6565b9281516001600160401b03908181116101725782612780918501612725565b85526020830151818111610172578261279a918501612725565b6020860152604083015181811161017257826127b7918501612725565b6040860152606083015181811161017257826127d4918501612725565b60608601526080830151908111610172576127ef9201612725565b6080830152565b919091610160818403126101725761280c6106e3565b928151906001600160401b0391828111610172578161282c918501612725565b855260208301518281116101725781612846918501612725565b602086015261285760408401611d31565b60408601526128686060840161273f565b60608601526080830151608086015260a083015160a086015260c08301519182116101725761289891830161274c565b60c08401526128a960e0820161219e565b60e08401526101006128bc81830161219e565b9084015261012080820151908401526101408091015190830152565b906020828203126101725781516001600160401b038111610172576104fa92016127f6565b6040519061290a826102b2565b6000602083606081520152565b6001600160401b0381116102415760051b60200190565b9190916040818403126101725760405190612948826102b2565b819381516001600160401b0381116101725782019181601f840112156101725761297b60209392838580955191016126f0565b845201519161298983611b07565b0152565b919091604081840312610172578051926001600160401b03938481116101725782019381601f860112156101725784516129c681612917565b906129d460405192836102cd565b808252602096878084019260051b8201019185831161017257888201905b838210612a12575050505094830151908111610172576104fa920161292e565b8151868111610172578a91612a2c898480948801016127f6565b8152019101906129f2565b9190916040818403126101725780519260208201516001600160401b039283821161017257016040818303126101725760405192612a74846102b2565b815190811161017257602092612a8b918301612725565b83520151602082015290565b6001600160a01b0390911681526040602082018190526104fa929101906103b7565b919082608091031261017257604051612ad181610297565b6060808294612adf8161219e565b8452612aed6020820161219e565b6020850152604081015160408501520151910152565b81601f8201121561017257805191612b1a83612917565b92612b2860405194856102cd565b808452602091828086019260071b85010193818511610172578301915b848310612b5457505050505090565b83608091612b628486612ab9565b815201920191612b45565b91909160808184031261017257612b826106f0565b9281516001600160401b03908181116101725782612ba1918501612725565b855260208301518181116101725782612bbb918501612725565b602086015260408301518181116101725782612bd8918501612725565b6040860152606083015190811161017257612bf39201612b03565b6060830152565b906020828203126101725781516001600160401b038111610172576104fa9201612b6d565b919091604080828503126101725781516001600160401b0381116101725784601f828501011215610172578083015190612c5882612917565b92612c65815194856102cd565b82845260208401918760208560051b83890101011161017257602081870101925b60208560051b83890101018410612cba5750505050509260208201516001600160401b038111610172576104fa920161292e565b83516001600160401b038111610172578288010183601f19828c03011261017257835190612ce7826102b2565b60208101516001600160401b038111610172578b6020612d0992840101612b6d565b825284810151906001600160401b03821161017257018a603f82011215610172576020810151612d3881612917565b91612d45875193846102cd565b818352602083018d8860a085028401011161017257818801908e5b8960a086028501018310612d895750505050506020828101919091529082529384019301612c86565b8260a09103126101725760208f9160a092612daf8c5191612da9836102b2565b86612ab9565b81526080850151838201528152019101908e612d60565b612e109493600093612dd66128fd565b50604051630428a14760e21b81526001600160a01b0390931660048401526080602484015291958693849391612e239160848601906103b7565b60031992838683030160448701526103b7565b90838203016064840152608080612e43845160a0855260a08501906103b7565b936001600160401b0380602083015116602086015260408201511660408501526060810151151560608501520151151591015203816108005afa9182156106c4576000908193612e9257509190565b90612eb09293503d8091833e612ea881836102cd565b810190612c1f565b9091565b60609060208152601060208201526f696e76616c69642063616c6c7479706560801b60408201520190565b3d15612f0a573d90612ef0826106fd565b91612efe60405193846102cd565b82523d6000602084013e565b606090565b15612f1657565b60405162461bcd60e51b81526020600482015260196024820152786661696c65642063616c6c20746f20707265636f6d70696c6560381b6044820152606490fd5b15612f5e57565b60405162461bcd60e51b815260206004820152601f60248201527f6661696c65642073746174696363616c6c20746f20707265636f6d70696c65006044820152606490fd5b15612faa57565b60405162461bcd60e51b815260206004820152602160248201527f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c6044820152606560f81b6064820152608490fd5b60405190613006826102b2565b601a82527f64656c65676174696f6e28616464726573732c737472696e67290000000000006020830152565b1561303957565b60405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606490fdfea2646970667358221220d1e8c1d6b1ef8b01471c4ab06fb8583615d477c90c9b7811388bad4cc56ef39d64736f6c63430008140033", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c8063088b32b1146101575780631904bb2e1461015257806319b16c4c1461014d5780632345e7d41461014857806329e71c821461014357806331bcbcb31461013e578063455b855114610139578063464d2d0314610134578063569c21e31461012f578063570467ac1461012a57806361bc221a1461012557806368ac3df314610120578063a4603a2e1461011b578063af9a90b214610116578063b13d424214610111578063b3e982341461010c578063b61b519714610107578063cf2753cf14610102578063ddbaf2c2146100fd5763f732b065146100f857600080fd5b611c2d565b611ab9565b611a1e565b6119af565b6118b5565b611773565b61160f565b6114ae565b611427565b6113fb565b611338565b61121d565b6111a2565b610f9f565b610d97565b610c97565b610a6d565b6107ec565b6105b2565b6103dc565b600435906001600160a01b038216820361017257565b600080fd5b60a435906001600160a01b038216820361017257565b602435906001600160a01b038216820361017257565b80548210156101bf5760005260206000209060021b0190600090565b634e487b7160e01b600052603260045260246000fd5b90600182811c92168015610205575b60208310146101ef57565b634e487b7160e01b600052602260045260246000fd5b91607f16916101e4565b634e487b7160e01b600052604160045260246000fd5b61016081019081106001600160401b0382111761024157604052565b61020f565b60a081019081106001600160401b0382111761024157604052565b606081019081106001600160401b0382111761024157604052565b60c081019081106001600160401b0382111761024157604052565b608081019081106001600160401b0382111761024157604052565b604081019081106001600160401b0382111761024157604052565b90601f801991011681019081106001600160401b0382111761024157604052565b9060405191826000825492610302846101d5565b908184526001948581169081600014610371575060011461032e575b505061032c925003836102cd565b565b9093915060005260209081600020936000915b81831061035957505061032c9350820101388061031e565b85548884018501529485019487945091830191610341565b91505061032c94506020925060ff191682840152151560051b820101388061031e565b60005b8381106103a75750506000910152565b8181015183820152602001610397565b906020916103d081518092818552858086019101610394565b601f01601f1916010190565b34610172576040366003190112610172576103f561015c565b6001600160a01b03166000908152600160205260409020805460243591908210156101725761045a91610427916101a3565b50610431816102ee565b906001810154906003600282015491015460070b906040519485946080865260808601906103b7565b926020850152604084015260608301520390f35b90600482101561047b5752565b634e487b7160e01b600052602160045260246000fd5b6104fa9160806104e96104d76104c56104b3865160a0875260a08701906103b7565b602087015186820360208801526103b7565b604086015185820360408701526103b7565b606085015184820360608601526103b7565b9201519060808184039101526103b7565b90565b9061056d61052961051784516101608086528501906103b7565b602085015184820360208601526103b7565b6040848101511515908401526105476060850151606085019061046e565b6080840151608084015260a084015160a084015260c084015183820360c0850152610491565b60e08084015160070b90830152916101008181015160070b9083015261012080820151908301526101408091015191015290565b9060206104fa9281815201906104fd565b34610172576020366003190112610172576101406106766105d161015c565b6040908151906105e082610225565b60608083528060208401526000958387949285878195015283818301528360808301528360a083015286519061061582610246565b80825260208201819052878201819052818101819052608082015260c082015260e08101839052610100810183905261012081018390520152825163111d9dbd60e11b81526001600160a01b03909116600482015292839081906024820190565b03816108005afa9182156106c4578361069b949361069f575b505051918291826105a1565b0390f35b6106bc9293503d8091833e6106b481836102cd565b8101906128d8565b90388061068f565b611e38565b6040519061032c826102b2565b6040519061032c82610246565b6040519061032c82610225565b6040519061032c82610297565b6001600160401b03811161024157601f01601f191660200190565b929192610724826106fd565b9161073260405193846102cd565b829481845281830111610172578281602093846000960137010152565b9080601f83011215610172578160206104fa93359101610718565b6060600319820112610172576004356001600160a01b038116810361017257916001600160401b0360243581811161017257836107a99160040161074f565b92604435918211610172576104fa9160040161074f565b90815260406020820152606060206107e3845160408086015260808501906103b7565b93015191015290565b34610172576107fa3661076a565b60009291926108076128fd565b506040938451916020948584019463120bba7360e11b86528461082e858460248401612a97565b0390610842601f19928381018852876102cd565b8851610861816108558b82018095611aa2565b038481018352826102cd565b5190209088518881019061088c8161085584600c906b19195b1959d85d1958d85b1b60a21b81520190565b51902082036108db575050505050916000806108cd9361069b969551906108005af4906108c06108ba612edf565b92612fa3565b8082518301019101612a37565b9290915b51928392836107c0565b8851691cdd185d1a58d8d85b1b60b21b898201908152906108ff81600a8401610855565b519020820361093b575050505050916000806109339361069b969551906108005afa906108c061092d612edf565b92612f57565b9290916108d1565b88516318d85b1b60e21b898201908152906109598160048401610855565b519020820361098e575050505050916000806109339361069b96955190826108005af1906108c0610988612edf565b92612f0f565b9193955091935086516109c487820192826109b8856008906763616c6c636f646560c01b81520190565b039081018352826102cd565b51902003610a515760a460c0926109ef6109dc612ff9565b8051908801206001600160e01b03191690565b908787870151960151885196879586948552600485015289602485015260336044850152606484015260848301526108005af291815192610100606084015193018552156101725761069b91610a436106c9565b9160608352820152926108d1565b845162461bcd60e51b815280610a6960048201612eb4565b0390fd5b34610172576060366003190112610172576001600160401b0360043581811161017257610a9e90369060040161074f565b6024359160443590811161017257610aba90369060040161074f565b91610ac3612075565b6040805160209485820192630fb6accf60e21b845282610ae886883060248501611eeb565b0391610afc601f19938481018652856102cd565b8151610b1b81610b0f8b82018095611aa2565b038581018352826102cd565b519020610b30610b2a42611f69565b60070b90565b92825189810190610b588161085584600c906b19195b1959d85d1958d85b1b60a21b81520190565b5190208203610b99575050505093600080610b9193610b979751906108005af490610b846108ba612edf565b80825183010191016121ac565b91612205565b005b8251691cdd185d1a58d8d85b1b60b21b8a820190815290610bbd81600a8401610855565b5190208203610be9575050505093600080610b9193610b979751906108005afa90610b8461092d612edf565b82516318d85b1b60e21b8a820190815290610c078160048401610855565b5190208203610c34575050505093600080610b9193610b97975190826108005af190610b84610988612edf565b9091929697610c5c845191820192826109b8856008906763616c6c636f646560c01b81520190565b51902003610c80575060009182915190826108005af21561017257610b9792612205565b5162461bcd60e51b815280610a6960048201612eb4565b34610172576040366003190112610172576004356001600160401b03811161017257610cc790369060040161074f565b602435610cd48183612377565b610cdc612075565b604051630fb6accf60e21b81529060208280610cfd84873060048501611eeb565b038160006108005af19182156106c457600092610d67575b5060008260070b1315610d2b57610b9792612205565b60405162461bcd60e51b81526020600482015260146024820152734661696c656420746f20756e64656c656761746560601b6044820152606490fd5b610d8991925060203d8111610d90575b610d8181836102cd565b8101906121ac565b9038610d15565b503d610d77565b606036600319011261017257610dab61015c565b6024356001600160401b03811161017257610dca90369060040161074f565b610dd2612075565b60405163a9059cbb60e01b6020820190815233602483015260448035818401528252610e1d91610e036064826102cd565b600094859283809351925af1610e17612edf565b50613032565b6040516353266bbb60e01b81529060208280610e3e34853060048501611eeb565b0381866108005af19182156106c457610e6a92610e62918591610e6d575b50611f15565b349033611f79565b80f35b610e8e915060203d8111610e94575b610e8681836102cd565b810190611d3c565b38610e5c565b503d610e7c565b906040600319830112610172576004356001600160a01b03811681036101725791602435906001600160401b038211610172576104fa9160040161074f565b906020908183528051916060928382860152610efb608091828701906103b7565b93828401519581601f1997610f1c60409889928b86830301848701526103b7565b96015197828703019101528280875195868152019601946000925b858410610f48575050505050505090565b86518051600790810b8a5281870151810b8a880152818401518a850152818501518a860152818301516001600160401b03168a84015260a091820151900b9089015260c09097019695840195600190930192610f37565b3461017257610fad36610e9b565b906040805191610fbc83610261565b60609384845284836020958287820152015282519163a03ffee160e01b83528280610fee600094859460048401612a97565b03816108005afa9384156106c4578194611010575b83518061069b8782610eda565b90919293503d8083853e61102481856102cd565b83019080848303126111685783516001600160401b0394858211611170570193868584031261116c5785519461105986610261565b8051828111611174578461106e918301612725565b8652828101518281116111745784611087918301612725565b838701528681015191821161117057019180601f8401121561116c578251966110af88612917565b946110bc885196876102cd565b888652838601928460c0809b0287010195818711611168578501935b8685106110f8575050505050505061069b93508282015290388080611003565b8a8583031261116857858b918b5161110f8161027c565b6111188861219e565b815261112583890161219e565b838201528c8801518d82015286880151878201526080808901519061114982611b07565b82015260a0611159818a0161219e565b908201528152019401936110d8565b8280fd5b8380fd5b8480fd5b8580fd5b602060031982011261017257600435906001600160401b038211610172576104fa9160040161074f565b6111ab36611178565b6111b3612075565b6040516353266bbb60e01b8152806111d034843060048501611eeb565b039160208260009481866108005af19182156106c4576111fa92610e62918591610e6d5750611f15565b80803415611214575b8180809234903390f1156106c45780f35b506108fc611203565b61122636611178565b61122e612075565b6040516353266bbb60e01b8152906020828061124f34853060048501611eeb565b038160006108005af19182156106c457610b9792610e6291600091610e6d5750611f15565b805190611289608092838552838501906103b7565b60606112b66112a460209384860151888203868a01526103b7565b604085015187820360408901526103b7565b9201519360608184039101528080855193848152019401926000905b8382106112e157505050505090565b909192939483828261131a6001948a5160608091805160070b8452602081015160070b6020850152604081015160408501520151910152565b01960194939201906112d2565b9060206104fa928181520190611274565b346101725760006113483661076a565b9092916113b46040519261135b84610297565b606080858180975281602082015281604082015201526113a26040519687958695631f67e4e760e21b875260018060a01b03166004870152602486015260648501906103b7565b838103600319016044850152906103b7565b03816108005afa80156106c45761069b916000916113da575b5060405191829182611327565b6113f5913d8091833e6113ed81836102cd565b810190612bfa565b386113cd565b34610172576000366003190112610172576020600254604051908152f35b908160a09103126101725790565b3461017257610100366003190112610172576001600160401b0360043581811161017257611459903690600401611419565b9060603660231901126101725761146e610177565b9160c4359182116101725761069b9261148e61149c93369060040161074f565b9060e4359260843590611e44565b60405190151581529081906020820190565b34610172576060366003190112610172576004356001600160401b038111610172576114de90369060040161074f565b604435906024356114ed612075565b600091825b33600052846001806020526040600020548310156115fb573360009081526001602052604090206115249084906101a3565b5061154585611532836102ee565b6020815191012090602081519101201490565b90816115e2575b5061156157505061155c90611fbf565b6114f2565b84955060209391949250600161157a915b151514612698565b611599604051968793849363096ac6ff60e11b8552306004860161252a565b038160006108005af19283156106c457610b97936115bf916000916115c4575b5061255d565b6125a9565b6115dc915060203d8111610e9457610e8681836102cd565b386115b9565b600301546115f3915060070b610b2a565b42103861154c565b5092938491509161157a6001602094611572565b34610172576080366003190112610172576004356001600160401b0381116101725761163f903690600401611419565b602061167061164c61018d565b604051632943c16b60e21b8152608060048201529384928392916084840190611da3565b6001600160a01b03909116602483015260448035908301526064803590830152038160006108005af180156106c45761069b916000916116be575b5060405190151581529081906020820190565b6116d6915060203d8111610e9457610e8681836102cd565b386116ab565b9060206001600160401b03816116fb85516040865260408601906103b7565b9401511691015290565b929160408401916040855280518093526060850160608460051b870101936020809301916000905b8282106117495750505050936104fa93948184039101526116dc565b909192958480611765600193605f198d82030186528a516104fd565b98019201920190929161172d565b346101725760406003198181360112610172576001600160401b03600435818111610172576117a690369060040161074f565b60243590828211610172576000926117c56117f3933690600401611419565b946117ce6128fd565b506080808851978896879663186b216760e01b88528b600489015260448801906103b7565b9386850301602487015261181861180a8280611d51565b60a0875260a0870191611d82565b9480602083013561182881611b07565b1660208601528a82013561183b81611b07565b168a850152606081013561184e81611b23565b15156060850152013561186081611b23565b151591015203816108005afa9182156106c457600091829361188c575b5061069b905192839283611705565b6118ad91935061069b923d8091833e6118a581836102cd565b81019061298d565b92909161187d565b3461017257600319606036820112610172576001600160401b0390600435828111610172576118e890369060040161074f565b916024359081116101725761190190369060040161074f565b61194f6020604435936119148587612377565b604051809381926354b826f560e01b83523060048401526080602484015261193f608484018a6103b7565b90838203016044840152866103b7565b866064830152038160006108005af19081156106c457610b9794611985600061198b9487948291611991575b5060070b13612419565b3361245c565b33611f79565b6119a9915060203d8111610d9057610d8181836102cd565b3861197b565b6119b836611178565b6119c0612075565b6040516353266bbb60e01b815290602082806119e134853060048501611eeb565b038160006108005af19182156106c457611a0692610e6291600091610e6d5750611f15565b60025460018101809111611a1957600255005b611f53565b3461017257611a566000611a3136610e9b565b90611a3a6128fd565b5060405163120bba7360e11b8152938492839260048401612a97565b03816108005afa9081156106c4576000908192611a7e575b5061069b604051928392836107c0565b90611a9b92503d8091833e611a9381836102cd565b810190612a37565b9038611a6e565b90611ab560209282815194859201610394565b0190565b34610172576020611af581611acd36610e9b565b9060018060a01b03166000526000825260406000208260405194838680955193849201610394565b82019081520301902054604051908152f35b6001600160401b0381160361017257565b359061032c82611b07565b8015150361017257565b359061032c82611b23565b92916040918285018386528151809152606086019060608160051b88010194602080940192600091825b848410611b8057505050505050936104fa93948184039101526116dc565b9091929394978690605f198c8203018552895182611ba5825187855287850190611274565b910151918381830391015282808351928381520192019084905b808210611bde5750505090806001929a01940194019294939190611b62565b919360a060019294828751611c1883825160608091805160070b8452602081015160070b6020850152604081015160408501520151910152565b01516080820152019401920189939291611bbf565b346101725760031960803682011261017257611c4761015c565b6001600160401b039060243582811161017257611c6890369060040161074f565b60443583811161017257611c8090369060040161074f565b91606435948486116101725760a09086360301126101725760405193611ca585610246565b85600401359081116101725785019436602387011215610172576084611d1791611cdc611d21983690602460048201359101610718565b8752611cea60248201611b18565b6020880152611cfb60448201611b18565b6040880152611d0c60648201611b2d565b606088015201611b2d565b6080850152612dc6565b9061069b60405192839283611b38565b519061032c82611b23565b9081602091031261017257516104fa81611b23565b9035601e19823603018112156101725701602081359101916001600160401b03821161017257813603831361017257565b908060209392818452848401376000828201840152601f01601f1916010190565b6104fa91611e2a611e1f611e04611de9611dce611dc08780611d51565b60a0885260a0880191611d82565b611ddb6020880188611d51565b908783036020890152611d82565b611df66040870187611d51565b908683036040880152611d82565b611e116060860186611d51565b908583036060870152611d82565b926080810190611d51565b916080818503910152611d82565b6040513d6000823e3d90fd5b9093611eb2611e7693956020956040519788968796637be6aa8b60e11b88526101006004890152610104880190611da3565b92602435602488015260443560448801526064356064880152608487015260018060a01b031660a48601526003198583030160c48601526103b7565b9060e4830152038160006108005af19081156106c457600091611ed3575090565b6104fa915060203d8111610e9457610e8681836102cd565b939291611f109060409260018060a01b031686526060602087015260608601906103b7565b930152565b15611f1c57565b60405162461bcd60e51b815260206004820152600f60248201526e19195b1959d85d194819985a5b1959608a1b6044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b90621baf808201809211611a1957565b611fa79160209160018060a01b03166000526000825260406000208260405194838680955193849201610394565b8201908152030190208054918201809211611a195755565b6000198114611a195760010190565b818110611fd9575050565b60008155600101611fce565b634e487b7160e01b600052600060045260246000fd5b906120635760038161200f600093546101d5565b80612026575b508260018201558260028201550155565b601f811160011461203c57508281555b38612015565b839082825261205a601f60208420920160051c820160018301611fce565b81835555612036565b611fe5565b91908203918211611a1957565b60005b336000526001602090808252604091826000208054851015612197578461209e916101a3565b509142600384015460070b11156120c2575b505050506120bd90611fbf565b612078565b3360009081526001602052604090206120e6906120e09087906101a3565b90611ffb565b828101543360009081526020819052604090209094519360009281549161210c836101d5565b9282811690811561217c5750600114612146575b505050815282900301902080546120bd939261213b91612068565b9055903880806120b0565b600090815285812093945091925b83831061216b5750505083019083816120bd612120565b805487840152918501918101612154565b60ff19168852505050801515028401915083816120bd612120565b5050505050565b51908160070b820361017257565b90816020910312610172576104fa9061219e565b9190601f81116121cf57505050565b61032c926000526020600020906020601f840160051c830193106121fb575b601f0160051c0190611fce565b90915081906121ee565b91903360005260016020918183526040600020926040519561222687610297565b86528086019182526040860193438552606087019560070b86528054600160401b8110156102415761225c9185820181556101a3565b9690966120635751908151916001600160401b0383116102415761228a836122848a546101d5565b8a6121c0565b81601f84116001146122fd57509282600396936122d4969361032c9a99966000926122f2575b505060001982891b1c191690831b1787555b51908601555160028501555160070b90565b9101906001600160401b0319825416906001600160401b0316179055565b0151905038806122b0565b9190601f1984166123138a600052602060002090565b936000905b82821061236057505093869361032c9a9996936122d498938360039b9810612348575b505050811b0187556122c2565b0151600019838b1b60f8161c1916905538808061233b565b808986978294978701518155019601940190612318565b602061239d91336000526000825260406000208260405194838680955193849201610394565b82019081520301902054106123ae57565b60405162461bcd60e51b815260206004820152603b60248201527f44656c65676174696f6e20646f6573206e6f74206578697374206f7220696e7360448201527f756666696369656e742064656c65676174696f6e20616d6f756e7400000000006064820152608490fd5b1561242057565b60405162461bcd60e51b81526020600482015260146024820152734661696c656420746f20726564656c656761746560601b6044820152606490fd5b9060018060a01b0382166000526000602052604060002091836040516020818551968287019761248d81848b610394565b82019081520301902054106124e5576001600160a01b03166000908152602081815260409091206124e1936124d093909190604051948593849251928391610394565b820190815203019020918254612068565b9055565b60405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742064656c65676174696f6e20616d6f756e7400006044820152606490fd5b6001600160a01b03909116815260806020820181905292949392606092612553918301906103b7565b9460408201520152565b1561256457565b60405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f2063616e63656c20756e626f6e64696e670000000000006044820152606490fd5b3360005260019160209083825260408481600020946000965b6125d0575b50505050505050565b8554871015612693576125e387876101a3565b509080600283015403612681575001928354918383106126305750509061260991612068565b8091551561261c575b80808080806125c7565b612629916120e0916101a3565b3880612612565b60849250519062461bcd60e51b82526004820152602560248201527f616d6f756e74206578636565647320756e626f6e64696e6720656e74727920616044820152641b5bdd5b9d60da1b6064820152fd5b905061268d8297611fbf565b966125c2565b6125c7565b1561269f57565b60405162461bcd60e51b815260206004820152602360248201527f556e626f6e64696e672064656c65676174696f6e20646f6573206e6f742065786044820152621a5cdd60ea1b6064820152608490fd5b909291926126fd816106fd565b9161270b60405193846102cd565b82948284528282011161017257602061032c930190610394565b9080601f830112156101725781516104fa926020016126f0565b5190600482101561017257565b91909160a081840312610172576127616106d6565b9281516001600160401b03908181116101725782612780918501612725565b85526020830151818111610172578261279a918501612725565b6020860152604083015181811161017257826127b7918501612725565b6040860152606083015181811161017257826127d4918501612725565b60608601526080830151908111610172576127ef9201612725565b6080830152565b919091610160818403126101725761280c6106e3565b928151906001600160401b0391828111610172578161282c918501612725565b855260208301518281116101725781612846918501612725565b602086015261285760408401611d31565b60408601526128686060840161273f565b60608601526080830151608086015260a083015160a086015260c08301519182116101725761289891830161274c565b60c08401526128a960e0820161219e565b60e08401526101006128bc81830161219e565b9084015261012080820151908401526101408091015190830152565b906020828203126101725781516001600160401b038111610172576104fa92016127f6565b6040519061290a826102b2565b6000602083606081520152565b6001600160401b0381116102415760051b60200190565b9190916040818403126101725760405190612948826102b2565b819381516001600160401b0381116101725782019181601f840112156101725761297b60209392838580955191016126f0565b845201519161298983611b07565b0152565b919091604081840312610172578051926001600160401b03938481116101725782019381601f860112156101725784516129c681612917565b906129d460405192836102cd565b808252602096878084019260051b8201019185831161017257888201905b838210612a12575050505094830151908111610172576104fa920161292e565b8151868111610172578a91612a2c898480948801016127f6565b8152019101906129f2565b9190916040818403126101725780519260208201516001600160401b039283821161017257016040818303126101725760405192612a74846102b2565b815190811161017257602092612a8b918301612725565b83520151602082015290565b6001600160a01b0390911681526040602082018190526104fa929101906103b7565b919082608091031261017257604051612ad181610297565b6060808294612adf8161219e565b8452612aed6020820161219e565b6020850152604081015160408501520151910152565b81601f8201121561017257805191612b1a83612917565b92612b2860405194856102cd565b808452602091828086019260071b85010193818511610172578301915b848310612b5457505050505090565b83608091612b628486612ab9565b815201920191612b45565b91909160808184031261017257612b826106f0565b9281516001600160401b03908181116101725782612ba1918501612725565b855260208301518181116101725782612bbb918501612725565b602086015260408301518181116101725782612bd8918501612725565b6040860152606083015190811161017257612bf39201612b03565b6060830152565b906020828203126101725781516001600160401b038111610172576104fa9201612b6d565b919091604080828503126101725781516001600160401b0381116101725784601f828501011215610172578083015190612c5882612917565b92612c65815194856102cd565b82845260208401918760208560051b83890101011161017257602081870101925b60208560051b83890101018410612cba5750505050509260208201516001600160401b038111610172576104fa920161292e565b83516001600160401b038111610172578288010183601f19828c03011261017257835190612ce7826102b2565b60208101516001600160401b038111610172578b6020612d0992840101612b6d565b825284810151906001600160401b03821161017257018a603f82011215610172576020810151612d3881612917565b91612d45875193846102cd565b818352602083018d8860a085028401011161017257818801908e5b8960a086028501018310612d895750505050506020828101919091529082529384019301612c86565b8260a09103126101725760208f9160a092612daf8c5191612da9836102b2565b86612ab9565b81526080850151838201528152019101908e612d60565b612e109493600093612dd66128fd565b50604051630428a14760e21b81526001600160a01b0390931660048401526080602484015291958693849391612e239160848601906103b7565b60031992838683030160448701526103b7565b90838203016064840152608080612e43845160a0855260a08501906103b7565b936001600160401b0380602083015116602086015260408201511660408501526060810151151560608501520151151591015203816108005afa9182156106c4576000908193612e9257509190565b90612eb09293503d8091833e612ea881836102cd565b810190612c1f565b9091565b60609060208152601060208201526f696e76616c69642063616c6c7479706560801b60408201520190565b3d15612f0a573d90612ef0826106fd565b91612efe60405193846102cd565b82523d6000602084013e565b606090565b15612f1657565b60405162461bcd60e51b81526020600482015260196024820152786661696c65642063616c6c20746f20707265636f6d70696c6560381b6044820152606490fd5b15612f5e57565b60405162461bcd60e51b815260206004820152601f60248201527f6661696c65642073746174696363616c6c20746f20707265636f6d70696c65006044820152606490fd5b15612faa57565b60405162461bcd60e51b815260206004820152602160248201527f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c6044820152606560f81b6064820152608490fd5b60405190613006826102b2565b601a82527f64656c65676174696f6e28616464726573732c737472696e67290000000000006020830152565b1561303957565b60405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606490fdfea2646970667358221220d1e8c1d6b1ef8b01471c4ab06fb8583615d477c90c9b7811388bad4cc56ef39d64736f6c63430008140033", + "bytecode": "0x6080604052346102a457604051602081016001600160401b038111828210176101df576040819052606081016001600160401b038111828210176101df57604052602381527f2f636f736d6f732e7374616b696e672e763162657461312e4d736744656c656760208201526261746560e81b604082015281526003546001600355806001106101f3575b5060035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b600182106100ca57604051612fac90816102f78239f35b80518051906001600160401b0382116101df576100e785546102a8565b601f81116101a4575b50602090601f831160011461013b5792826001949360209386955f92610130575b50505f19600383901b1c191690841b1786555b019301910190916100b3565b015190505f80610111565b90601f19831691865f52815f20925f5b81811061018c5750936020936001969387969383889510610174575b505050811b018655610124565b01515f1960f88460031b161c191690555f8080610167565b8284015185556001909401936020938401930161014b565b6101cf90865f5260205f20601f850160051c810191602086106101d5575b601f0160051c01906102e0565b5f6100f0565b90915081906101c2565b634e487b7160e01b5f52604160045260245ffd5b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b017fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c5b8181106102485750610089565b80610255600192546102a8565b80610262575b500161023b565b601f8111831461027757505f81555b5f61025b565b61029390825f5283601f60205f20920160051c820191016102e0565b805f525f6020812081835555610271565b5f80fd5b90600182811c921680156102d6575b60208310146102c257565b634e487b7160e01b5f52602260045260245ffd5b91607f16916102b7565b8181106102eb575050565b5f81556001016102e056fe60806040526004361015610011575f80fd5b5f3560e01c8063088b32b1146101545780631904bb2e1461014f57806319b16c4c1461014a5780632345e7d41461014557806329e71c821461014057806331bcbcb31461013b578063455b855114610136578063464d2d0314610131578063569c21e31461012c578063570467ac1461012757806361bc221a1461012257806368ac3df31461011d578063a4603a2e14610118578063af9a90b214610113578063b13d42421461010e578063b3e9823414610109578063b61b519714610104578063cf2753cf146100ff578063ddbaf2c2146100fa5763f732b065146100f5575f80fd5b611b57565b6119f8565b611963565b6118f6565b6117fa565b6116a6565b611543565b6113f1565b611365565b61133a565b611279565b6111ac565b611135565b610f2e565b610d2f565b610c31565b610a2e565b6107b5565b610578565b6103d0565b600435906001600160a01b038216820361016f57565b5f80fd5b60a435906001600160a01b038216820361016f57565b602435906001600160a01b038216820361016f57565b80548210156101b8575f5260205f209060021b01905f90565b634e487b7160e01b5f52603260045260245ffd5b90600182811c921680156101fa575b60208310146101e657565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101db565b634e487b7160e01b5f52604160045260245ffd5b61016081019081106001600160401b0382111761023457604052565b610204565b60a081019081106001600160401b0382111761023457604052565b606081019081106001600160401b0382111761023457604052565b60c081019081106001600160401b0382111761023457604052565b608081019081106001600160401b0382111761023457604052565b604081019081106001600160401b0382111761023457604052565b90601f801991011681019081106001600160401b0382111761023457604052565b9060405191825f8254926102f4846101cc565b808452936001811690811561035f575060011461031b575b50610319925003836102c0565b565b90505f9291925260205f20905f915b818310610343575050906020610319928201015f61030c565b602091935080600191548385890101520191019091849261032a565b90506020925061031994915060ff191682840152151560051b8201015f61030c565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b926103bd606093969592608086526080860190610381565b956020850152604084015260070b910152565b3461016f57604036600319011261016f576103e9610159565b6001600160a01b03165f90815260016020526040902080546024359081101561016f576104159161019f565b5061041f816102e1565b6104426001830154926003600282015491015460070b90604051948594856103a5565b0390f35b9060048210156104535752565b634e487b7160e01b5f52602160045260245ffd5b6104d09160806104bf6104ad61049b610489865160a0875260a0870190610381565b60208701518682036020880152610381565b60408601518582036040870152610381565b60608501518482036060860152610381565b920151906080818403910152610381565b90565b90610140806105376104f361048986516101608752610160870190610381565b60408681015115159086015261051160608701516060870190610446565b6080860151608086015260a086015160a086015260c086015185820360c0870152610467565b60e08086015160070b90850152936101008181015160070b90850152610120810151610120850152015191015290565b9060206104d09281815201906104d3565b3461016f57602036600319011261016f576106375f610595610159565b816101406040516105a581610218565b60608152606060208201528260408201528260608201528260808201528260a08201526040516105d481610239565b6060815260606020820152606060408201526060808201526060608082015260c08201528260e0820152826101008201528261012082015201526040518093819263111d9dbd60e11b835260048301919091602081019260018060a01b03169052565b03816108005afa801561067e57610442915f9161065c575b5060405191829182610567565b61067891503d805f833e61067081836102c0565b810190611e98565b5f61064f565b611ebd565b604051906103196040836102c0565b6040519061031960a0836102c0565b60405190610319610160836102c0565b604051906103196080836102c0565b6001600160401b03811161023457601f01601f191660200190565b9291926106e7826106c0565b916106f560405193846102c0565b82948184528183011161016f578281602093845f960137010152565b9080601f8301121561016f578160206104d0933591016106db565b606060031982011261016f576004356001600160a01b038116810361016f57916024356001600160401b03811161016f578261076a91600401610711565b91604435906001600160401b03821161016f576104d091600401610711565b90815260406020820152606060206107ac84516040808601526080850190610381565b93015191015290565b3461016f576107c33661072c565b91906107cd611ec8565b5060405191602083019363120bba7360e11b8552610801846107f3858560248401611ee1565b03601f1981018652856102c0565b604051610824816108166020820180956119e6565b03601f1981018352826102c0565b5190206040516b19195b1959d85d1958d85b1b60a21b602082019081529061084f81602c8101610816565b519020810361089a575050505f61088992819251906108005af461087a610874611f3e565b91612067565b60208082518301019101611fb5565b905b61044260405192839283610789565b604051691cdd185d1a58d8d85b1b60b21b60208201908152906108c081602a8101610816565b51902081036108f1575050505f6108eb92819251906108005afa61087a6108e5611f3e565b9161201b565b9061088b565b6040516318d85b1b60e21b60208201908152906109118160248101610816565b519020810361093d575050505f6108eb9281925190826108005af161087a610937611f3e565b91611f6d565b9193509150604051602081019061096781610816846008906763616c6c636f646560c01b81520190565b519020036109f65761098d61097a611f03565b6020815191012063ffffffff60e01b1690565b916040602082015191015191604051938452600484015260406024840152603360448401526064830152608482015260c08160a4815f6108005af290805191610100606083015192016040521561016f576109e6610683565b906060825260208201529061088b565b60405162461bcd60e51b815260206004820152601060248201526f696e76616c69642063616c6c7479706560801b6044820152606490fd5b3461016f57606036600319011261016f576004356001600160401b03811161016f57610a5e903690600401610711565b602435906044356001600160401b03811161016f57610a81903690600401610711565b91610a8a612a62565b604051630fb6accf60e21b602082019081529093610abf85610ab1858730602485016120bd565b03601f1981018752866102c0565b604051610ad4816108166020820180956119e6565b51902093610aea610ae4426120fb565b60070b90565b6040516b19195b1959d85d1958d85b1b60a21b6020820190815290610b1281602c8101610816565b5190208603610b515750610b4f94505f610b4992819251906108005af4610b3a610874611f3e565b6020808251830101910161210b565b91612b54565b005b604051691cdd185d1a58d8d85b1b60b21b6020820190815290610b7781602a8101610816565b5190208603610b9f5750610b4f94505f610b4992819251906108005afa610b3a6108e5611f3e565b6040516318d85b1b60e21b6020820190815290610bbf8160248101610816565b5190208603610be85750610b4f94505f610b499281925190826108005af1610b3a610937611f3e565b93946040516020810190610c0f81610816846008906763616c6c636f646560c01b81520190565b519020036109f6575f9182915190826108005af21561016f57610b4f92612b54565b3461016f57604036600319011261016f576004356001600160401b03811161016f57610c61903690600401610711565b602435610c6e8183612cc3565b610c76612a62565b604051630fb6accf60e21b81529060208280610c97848730600485016120bd565b03815f6108005af191821561067e575f92610cfe575b505f8260070b1315610cc257610b4f92612b54565b60405162461bcd60e51b81526020600482015260146024820152734661696c656420746f20756e64656c656761746560601b6044820152606490fd5b610d2191925060203d602011610d28575b610d1981836102c0565b81019061210b565b905f610cad565b503d610d0f565b606036600319011261016f57610d43610159565b6024356001600160401b03811161016f575f80610d67610db4933690600401610711565b93604435610d73612a62565b60405163a9059cbb60e01b6020820190815233602483015260448201929092528390610da28160648101610816565b51925af1610dae611f3e565b5061211f565b6040516353266bbb60e01b81529060208280610dd5348530600485016120bd565b03815f6108005af191821561067e57610b4f92610df9915f91610e01575b50612172565b349033612d59565b610e23915060203d602011610e29575b610e1b81836102c0565b81019061215d565b5f610df3565b503d610e11565b90604060031983011261016f576004356001600160a01b038116810361016f5791602435906001600160401b03821161016f576104d091600401610711565b90602082526040610ea4610e8f8351606060208701526080860190610381565b6020840151858203601f190184870152610381565b910151916060601f1982840301910152602080835192838152019201905f5b818110610ed05750505090565b909192602060c060019260a08751805160070b83528481015160070b8584015260408101516040840152606081015160608401526001600160401b036080820151166080840152015160070b60a08201520194019101919091610ec3565b3461016f57610f775f610f4036610e30565b90606060408051610f5081610254565b82815260208101839052015260405163a03ffee160e01b8152938492839260048401611ee1565b03816108005afa801561067e575f90610f9b575b6104429060405191829182610e6f565b503d805f833e610fab81836102c0565b81019060208183031261016f578051906001600160401b03821161016f570160608183031261016f5760405190610fe182610254565b80516001600160401b03811161016f5783610ffd918301611ca5565b825260208101516001600160401b03811161016f578361101e918301611ca5565b60208301526040810151906001600160401b03821161016f57019180601f8401121561016f57825192611050846121b0565b9161105e60405193846102c0565b848352602060c081850196028301019181831161016f57602001945b8286106110935750505061044292506040820152610f8b565b60c08683031261016f57602060c0916040516110ae8161026f565b6110b789611d9b565b81526110c4838a01611d9b565b83820152604089015160408201526060890151606082015260808901516110ea81611a3a565b60808201526110fb60a08a01611d9b565b60a082015281520195019461107a565b602060031982011261016f57600435906001600160401b03821161016f576104d091600401610711565b61113e3661110b565b611146612a62565b6040516353266bbb60e01b81529060208280611167348530600485016120bd565b03815f6108005af191821561067e5761118a92610df9915f91610e015750612172565b5f34156111a3575b5f8080809334903390f11561067e57005b506108fc611192565b6111b53661110b565b610db4612a62565b60606111fc6111ea6111d88451608087526080870190610381565b60208501518682036020880152610381565b60408401518582036040870152610381565b910151916060818303910152602080835192838152019201905f5b8181106112245750505090565b909192602060808261125d600194885160608091805160070b8452602081015160070b6020850152604081015160408501520151910152565b019401929101611217565b9060206104d09281815201906111bd565b3461016f576112e15f6112f361128e3661072c565b6060806040959395516112a08161028a565b81815281602082015281604082015201526040519586948594631f67e4e760e21b865260018060a01b03166004860152606060248601526064850190610381565b83810360031901604485015290610381565b03816108005afa801561067e57610442915f91611318575b5060405191829182611268565b61133491503d805f833e61132c81836102c0565b810190612319565b5f61130b565b3461016f575f36600319011261016f576020600254604051908152f35b908160a091031261016f5790565b3461016f5761010036600319011261016f576004356001600160401b03811161016f57611396903690600401611357565b606036602319011261016f576084356113ad610173565b9160c435916001600160401b03831161016f57610442936113d56113df943690600401610711565b9160e43593612424565b60405190151581529081906020820190565b3461016f57606036600319011261016f576004356001600160401b03811161016f57611421903690600401610711565b60243560443561142f612a62565b5f915f5b335f52600160205260405f205481101561153157335f90815260016020526040902061146590829061019f565b61019f565b5061148686611473836102e1565b6020815191012090602081519101201490565b9081611518575b5061149a57600101611433565b50915060208282946114b16001805b151514612d93565b6114d0604051968793849363096ac6ff60e11b855230600486016124ca565b03815f6108005af192831561067e57610b4f936114f4915f916114f9575b506124fd565b612e45565b611512915060203d602011610e2957610e1b81836102c0565b5f6114ee565b60030154611529915060070b610ae4565b42105f61148d565b50918282946114b160016020946114a9565b3461016f57608036600319011261016f576004356001600160401b03811161016f57611573903690600401611357565b60206115ab611580610189565b9260443593606435604051632943c16b60e21b8152608060048201529586948594608486019061238f565b6001600160a01b0390931660248501526044840152606483015203815f6108005af1801561067e57610442915f916115f1575b5060405190151581529081906020820190565b61160a915060203d602011610e2957610e1b81836102c0565b5f6115de565b9060206001600160401b038161162f8551604086526040860190610381565b9401511691015290565b929160408401936040815282518095526060810194602060608260051b8401019401905f5b81811061167b575050506104d09394506020818403910152611610565b909194602080611697600193605f19888203018c5289516104d3565b9701980191019691909661165e565b3461016f57604036600319011261016f576004356001600160401b03811161016f576116d6903690600401610711565b6024356001600160401b03811161016f576117266116f95f923690600401611357565b92611702611ec8565b50604051938492839263186b216760e01b8452604060048501526044840190610381565b828103600319016024840152608080611750611742858061233e565b60a0865260a086019161236f565b936001600160401b03602082013561176781611a3a565b1660208501526001600160401b03604082013561178381611a3a565b166040850152606081013561179781611a56565b1515606085015201356117a981611a56565b151591015203816108005afa90811561067e575f905f926117d5575b5061044260405192839283611639565b90506117f391503d805f833e6117eb81836102c0565b8101906125a8565b905f6117c5565b3461016f57606036600319011261016f576004356001600160401b03811161016f5761182a903690600401610711565b6024356001600160401b03811161016f57611849903690600401610711565b604435906118578284612cc3565b6040516354b826f560e01b815230600482015260806024820152602081806118976118856084830189610381565b82810360031901604484015286610381565b86606483015203815f6108005af190811561067e57610b4f946118cb5f6118d194879482916118d7575b5060070b1361265e565b33612ebd565b33612d59565b6118f0915060203d602011610d2857610d1981836102c0565b5f6118c1565b6118ff3661110b565b611907612a62565b6040516353266bbb60e01b81529060208280611928348530600485016120bd565b03815f6108005af191821561067e5761194b92610df9915f91610e015750612172565b6002546001810180911161195e57600255005b6120e7565b3461016f5761199a5f61197536610e30565b9061197e611ec8565b5060405163120bba7360e11b8152938492839260048401611ee1565b03816108005afa90811561067e575f905f926119c1575b5061044260405192839283610789565b90506119df91503d805f833e6119d781836102c0565b810190611fb5565b905f6119b1565b805191908290602001825e015f815290565b3461016f576020611a2a81611a0c36610e30565b9060018060a01b03165f525f825260405f20604051938480936119e6565b9081520301902054604051908152f35b6001600160401b0381160361016f57565b359061031982611a3a565b8015150361016f57565b359061031982611a56565b9291604084016040855282518091526060850190602060608260051b8801019401915f905b828210611aad57505050508360206104d094958403910152611610565b90919294605f1988820301825285516020611ad182516040855260408501906111bd565b91015182820360209384015280518083529183019201905f905b808210611b0957505050602080600192970192019201909291611a90565b909192602060a0600192828751611b4583825160608091805160070b8452602081015160070b6020850152604081015160408501520151910152565b01516080820152019401920190611aeb565b3461016f57608036600319011261016f57611b70610159565b6024356001600160401b03811161016f57611b8f903690600401610711565b906044356001600160401b03811161016f57611baf903690600401610711565b606435926001600160401b03841161016f5760a0600319853603011261016f5760405192611bdc84610239565b84600401356001600160401b03811161016f578501943660238701121561016f576084611c5591611c1a611c5f9836906024600482013591016106db565b8752611c2860248201611a4b565b6020880152611c3960448201611a4b565b6040880152611c4a60648201611a60565b606088015201611a60565b6080850152612831565b9061044260405192839283611a6b565b929192611c7b826106c0565b91611c8960405193846102c0565b82948184528183011161016f578281602093845f96015e010152565b9080601f8301121561016f5781516104d092602001611c6f565b519061031982611a56565b5190600482101561016f57565b91909160a08184031261016f57611cec610692565b9281516001600160401b03811161016f5781611d09918401611ca5565b845260208201516001600160401b03811161016f5781611d2a918401611ca5565b602085015260408201516001600160401b03811161016f5781611d4e918401611ca5565b604085015260608201516001600160401b03811161016f5781611d72918401611ca5565b606085015260808201516001600160401b03811161016f57611d949201611ca5565b6080830152565b51908160070b820361016f57565b91906101608382031261016f57611dbe6106a1565b9280516001600160401b03811161016f5782611ddb918301611ca5565b845260208101516001600160401b03811161016f5782611dfc918301611ca5565b6020850152611e0d60408201611cbf565b6040850152611e1e60608201611cca565b60608501526080810151608085015260a081015160a085015260c08101516001600160401b03811161016f5761014092611e59918301611cd7565b60c0850152611e6a60e08201611d9b565b60e0850152611e7c6101008201611d9b565b6101008501526101208101516101208501520151610140830152565b9060208282031261016f5781516001600160401b03811161016f576104d09201611da9565b6040513d5f823e3d90fd5b60405190611ed5826102a5565b5f602083606081520152565b6001600160a01b0390911681526040602082018190526104d092910190610381565b60405190611f126040836102c0565b601a82527f64656c65676174696f6e28616464726573732c737472696e67290000000000006020830152565b3d15611f68573d90611f4f826106c0565b91611f5d60405193846102c0565b82523d5f602084013e565b606090565b15611f7457565b60405162461bcd60e51b81526020600482015260196024820152786661696c65642063616c6c20746f20707265636f6d70696c6560381b6044820152606490fd5b919060408382031261016f578251926020810151906001600160401b03821161016f57019060408282031261016f5760405191611ff1836102a5565b80516001600160401b03811161016f5760209261200f918301611ca5565b83520151602082015290565b1561202257565b60405162461bcd60e51b815260206004820152601f60248201527f6661696c65642073746174696363616c6c20746f20707265636f6d70696c65006044820152606490fd5b1561206e57565b60405162461bcd60e51b815260206004820152602160248201527f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c6044820152606560f81b6064820152608490fd5b9392916120e29060409260018060a01b03168652606060208701526060860190610381565b930152565b634e487b7160e01b5f52601160045260245ffd5b90621baf80820180921161195e57565b9081602091031261016f576104d090611d9b565b1561212657565b60405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606490fd5b9081602091031261016f57516104d081611a56565b1561217957565b60405162461bcd60e51b815260206004820152600f60248201526e19195b1959d85d194819985a5b1959608a1b6044820152606490fd5b6001600160401b0381116102345760051b60200190565b919082608091031261016f576040516121df8161028a565b60608082946121ed81611d9b565b84526121fb60208201611d9b565b6020850152604081015160408501520151910152565b81601f8201121561016f578051612227816121b0565b9261223560405194856102c0565b81845260208085019260071b8401019281841161016f57602001915b83831061225f575050505090565b602060809161226e84866121c7565b815201920191612251565b91909160808184031261016f5761228e6106b1565b9281516001600160401b03811161016f57816122ab918401611ca5565b845260208201516001600160401b03811161016f57816122cc918401611ca5565b602085015260408201516001600160401b03811161016f57816122f0918401611ca5565b604085015260608201516001600160401b03811161016f576123129201612211565b6060830152565b9060208282031261016f5781516001600160401b03811161016f576104d09201612279565b9035601e198236030181121561016f5701602081359101916001600160401b03821161016f57813603831361016f57565b908060209392818452848401375f828201840152601f01601f1916010190565b6104d09161241661240b6123f06123d56123ba6123ac878061233e565b60a0885260a088019161236f565b6123c7602088018861233e565b90878303602089015261236f565b6123e2604087018761233e565b90868303604088015261236f565b6123fd606086018661233e565b90858303606087015261236f565b92608081019061233e565b91608081850391015261236f565b909361249261245693956020956040519788968796637be6aa8b60e11b8852610100600489015261010488019061238f565b92602435602488015260443560448801526064356064880152608487015260018060a01b031660a48601526003198583030160c4860152610381565b9060e483015203815f6108005af190811561067e575f916124b1575090565b6104d0915060203d602011610e2957610e1b81836102c0565b6001600160a01b039091168152608060208201819052929493926060926124f391830190610381565b9460408201520152565b1561250457565b60405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f2063616e63656c20756e626f6e64696e670000000000006044820152606490fd5b91909160408184031261016f5760405190612563826102a5565b819381516001600160401b03811161016f5782019181601f8401121561016f576125966020939283858095519101611c6f565b84520151916125a483611a3a565b0152565b91909160408184031261016f5780516001600160401b03811161016f57810183601f8201121561016f5780516125dd816121b0565b916125eb60405193846102c0565b81835260208084019260051b8201019186831161016f5760208201905b83821061263157505050509260208201516001600160401b03811161016f576104d09201612549565b81516001600160401b03811161016f576020916126538a848094880101611da9565b815201910190612608565b1561266557565b60405162461bcd60e51b81526020600482015260146024820152734661696c656420746f20726564656c656761746560601b6044820152606490fd5b91909160408184031261016f5780516001600160401b03811161016f57810183601f8201121561016f578051906126d7826121b0565b916126e560405193846102c0565b80835260208084019160051b8301019186831161016f5760208101915b83831061272b57505050509260208201516001600160401b03811161016f576104d09201612549565b82516001600160401b03811161016f5782016040818a03601f19011261016f5760405190612758826102a5565b60208101516001600160401b03811161016f578a602061277a92840101612279565b825260408101516001600160401b03811161016f57602091010189601f8201121561016f5780516127aa816121b0565b916127b860405193846102c0565b818352602060a08185019302820101908c821161016f57602001915b8c8284106127f5575050505091816020938480940152815201920191612702565b8360a091031261016f57602060a0918e61281b60405191612815836102a5565b876121c7565b81526080860151838201528152019201916127d4565b61287a949361288c5f94612843611ec8565b50604051630428a14760e21b81526001600160a01b0390941660048501526080602485015292968794859491906084860190610381565b84810360031901604486015290610381565b6003198382030160648401526080806128ae845160a0855260a0850190610381565b936001600160401b0360208201511660208501526001600160401b0360408201511660408501526060810151151560608501520151151591015203816108005afa91821561067e575f905f9361290357509190565b90506129229192503d805f833e61291a81836102c0565b8101906126a1565b9091565b818110612931575050565b5f8155600101612926565b634e487b7160e01b5f525f60045260245ffd5b906129cb576003816129625f93546101cc565b80612979575b508260018201558260028201550155565b601f811160011461298f57508281555b5f612968565b818452602084206129ab91601f0160051c810190600101612926565b808352826020812080548260011b90831984871b1c191617835555612989565b61293c565b9060405180925f908054906129e4826101cc565b9160018116908115612a3d5750600114612a07575b505060209281520301902090565b9091505f5260205f205f905b828210612a26575050810160205f6129f9565b805482870152859350602090910190600101612a13565b60ff191685525050801515028201905060205f6129f9565b9190820391821161195e57565b5f5b335f52600160205260405f2054811015612b0e5780612a996001926114603360018060a01b03165f52600160205260405f2090565b50600381015460070b421015612ab1575b5001612a64565b335f908152600160205260409020612ad490612ace90849061019f565b9061294f565b612b06612afe8483015492612af83360018060a01b03165f525f60205260405f2090565b906129d0565b918254612a55565b90555f612aaa565b50565b9190601f8111612b2057505050565b610319925f5260205f20906020601f840160051c83019310612b4a575b601f0160051c0190612926565b9091508190612b3d565b909291335f52600160205260405f2060405192612b708461028a565b8352602083019485526040830190438252606084019260070b83528054600160401b81101561023457612ba89160018201815561019f565b9390936129cb57519485516001600160401b03811161023457612bd581612bcf87546101cc565b87612b11565b6020601f8211600114612c4f5791612c1082612c269593600397956103199a9b5f92612c44575b50508160011b915f199060031b1c19161790565b86555b5160018601555160028501555160070b90565b9101906001600160401b0319825416906001600160401b0316179055565b015190505f80612bfc565b601f19821697612c62875f5260205f2090565b985f5b818110612cab5750926103199899600397959360019383612c26999710612c94575b505050811b018655612c13565b01515f19838a1b60f8161c191690555f8080612c87565b838301518b556001909a019960209384019301612c65565b6020612cdf91335f525f825260405f20604051938480936119e6565b908152030190205410612cee57565b60405162461bcd60e51b815260206004820152603b60248201527f44656c65676174696f6e20646f6573206e6f74206578697374206f7220696e7360448201527f756666696369656e742064656c65676174696f6e20616d6f756e7400000000006064820152608490fd5b612d7d9160209160018060a01b03165f525f825260405f20604051938480936119e6565b90815203019020805491820180921161195e5755565b15612d9a57565b60405162461bcd60e51b815260206004820152602360248201527f556e626f6e64696e672064656c65676174696f6e20646f6573206e6f742065786044820152621a5cdd60ea1b6064820152608490fd5b15612df257565b60405162461bcd60e51b815260206004820152602560248201527f616d6f756e74206578636565647320756e626f6e64696e6720656e74727920616044820152641b5bdd5b9d60da1b6064820152608490fd5b90335f52600160205260405f20905f925b8254841015612eb757612e69848461019f565b509080600283015403612eab57506001612e929101918254612e8d82821015612deb565b612a55565b81555415612e9e575050565b61031991612ace9161019f565b93600191500192612e56565b50505050565b9060018060a01b0382165f525f6020528260405f2060206040518092612ee382876119e6565b908152030190205410612f31576020612f1e91612f12612f2d9460018060a01b03165f525f60205260405f2090565b604051938480936119e6565b90815203019020918254612a55565b9055565b60405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742064656c65676174696f6e20616d6f756e7400006044820152606490fdfea26469706673582212208d49d0d1e8f0820033c0b8f7c6ea5a99e5c3bd60ce80408972943227d4d15c6d64736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c8063088b32b1146101545780631904bb2e1461014f57806319b16c4c1461014a5780632345e7d41461014557806329e71c821461014057806331bcbcb31461013b578063455b855114610136578063464d2d0314610131578063569c21e31461012c578063570467ac1461012757806361bc221a1461012257806368ac3df31461011d578063a4603a2e14610118578063af9a90b214610113578063b13d42421461010e578063b3e9823414610109578063b61b519714610104578063cf2753cf146100ff578063ddbaf2c2146100fa5763f732b065146100f5575f80fd5b611b57565b6119f8565b611963565b6118f6565b6117fa565b6116a6565b611543565b6113f1565b611365565b61133a565b611279565b6111ac565b611135565b610f2e565b610d2f565b610c31565b610a2e565b6107b5565b610578565b6103d0565b600435906001600160a01b038216820361016f57565b5f80fd5b60a435906001600160a01b038216820361016f57565b602435906001600160a01b038216820361016f57565b80548210156101b8575f5260205f209060021b01905f90565b634e487b7160e01b5f52603260045260245ffd5b90600182811c921680156101fa575b60208310146101e657565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101db565b634e487b7160e01b5f52604160045260245ffd5b61016081019081106001600160401b0382111761023457604052565b610204565b60a081019081106001600160401b0382111761023457604052565b606081019081106001600160401b0382111761023457604052565b60c081019081106001600160401b0382111761023457604052565b608081019081106001600160401b0382111761023457604052565b604081019081106001600160401b0382111761023457604052565b90601f801991011681019081106001600160401b0382111761023457604052565b9060405191825f8254926102f4846101cc565b808452936001811690811561035f575060011461031b575b50610319925003836102c0565b565b90505f9291925260205f20905f915b818310610343575050906020610319928201015f61030c565b602091935080600191548385890101520191019091849261032a565b90506020925061031994915060ff191682840152151560051b8201015f61030c565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b926103bd606093969592608086526080860190610381565b956020850152604084015260070b910152565b3461016f57604036600319011261016f576103e9610159565b6001600160a01b03165f90815260016020526040902080546024359081101561016f576104159161019f565b5061041f816102e1565b6104426001830154926003600282015491015460070b90604051948594856103a5565b0390f35b9060048210156104535752565b634e487b7160e01b5f52602160045260245ffd5b6104d09160806104bf6104ad61049b610489865160a0875260a0870190610381565b60208701518682036020880152610381565b60408601518582036040870152610381565b60608501518482036060860152610381565b920151906080818403910152610381565b90565b90610140806105376104f361048986516101608752610160870190610381565b60408681015115159086015261051160608701516060870190610446565b6080860151608086015260a086015160a086015260c086015185820360c0870152610467565b60e08086015160070b90850152936101008181015160070b90850152610120810151610120850152015191015290565b9060206104d09281815201906104d3565b3461016f57602036600319011261016f576106375f610595610159565b816101406040516105a581610218565b60608152606060208201528260408201528260608201528260808201528260a08201526040516105d481610239565b6060815260606020820152606060408201526060808201526060608082015260c08201528260e0820152826101008201528261012082015201526040518093819263111d9dbd60e11b835260048301919091602081019260018060a01b03169052565b03816108005afa801561067e57610442915f9161065c575b5060405191829182610567565b61067891503d805f833e61067081836102c0565b810190611e98565b5f61064f565b611ebd565b604051906103196040836102c0565b6040519061031960a0836102c0565b60405190610319610160836102c0565b604051906103196080836102c0565b6001600160401b03811161023457601f01601f191660200190565b9291926106e7826106c0565b916106f560405193846102c0565b82948184528183011161016f578281602093845f960137010152565b9080601f8301121561016f578160206104d0933591016106db565b606060031982011261016f576004356001600160a01b038116810361016f57916024356001600160401b03811161016f578261076a91600401610711565b91604435906001600160401b03821161016f576104d091600401610711565b90815260406020820152606060206107ac84516040808601526080850190610381565b93015191015290565b3461016f576107c33661072c565b91906107cd611ec8565b5060405191602083019363120bba7360e11b8552610801846107f3858560248401611ee1565b03601f1981018652856102c0565b604051610824816108166020820180956119e6565b03601f1981018352826102c0565b5190206040516b19195b1959d85d1958d85b1b60a21b602082019081529061084f81602c8101610816565b519020810361089a575050505f61088992819251906108005af461087a610874611f3e565b91612067565b60208082518301019101611fb5565b905b61044260405192839283610789565b604051691cdd185d1a58d8d85b1b60b21b60208201908152906108c081602a8101610816565b51902081036108f1575050505f6108eb92819251906108005afa61087a6108e5611f3e565b9161201b565b9061088b565b6040516318d85b1b60e21b60208201908152906109118160248101610816565b519020810361093d575050505f6108eb9281925190826108005af161087a610937611f3e565b91611f6d565b9193509150604051602081019061096781610816846008906763616c6c636f646560c01b81520190565b519020036109f65761098d61097a611f03565b6020815191012063ffffffff60e01b1690565b916040602082015191015191604051938452600484015260406024840152603360448401526064830152608482015260c08160a4815f6108005af290805191610100606083015192016040521561016f576109e6610683565b906060825260208201529061088b565b60405162461bcd60e51b815260206004820152601060248201526f696e76616c69642063616c6c7479706560801b6044820152606490fd5b3461016f57606036600319011261016f576004356001600160401b03811161016f57610a5e903690600401610711565b602435906044356001600160401b03811161016f57610a81903690600401610711565b91610a8a612a62565b604051630fb6accf60e21b602082019081529093610abf85610ab1858730602485016120bd565b03601f1981018752866102c0565b604051610ad4816108166020820180956119e6565b51902093610aea610ae4426120fb565b60070b90565b6040516b19195b1959d85d1958d85b1b60a21b6020820190815290610b1281602c8101610816565b5190208603610b515750610b4f94505f610b4992819251906108005af4610b3a610874611f3e565b6020808251830101910161210b565b91612b54565b005b604051691cdd185d1a58d8d85b1b60b21b6020820190815290610b7781602a8101610816565b5190208603610b9f5750610b4f94505f610b4992819251906108005afa610b3a6108e5611f3e565b6040516318d85b1b60e21b6020820190815290610bbf8160248101610816565b5190208603610be85750610b4f94505f610b499281925190826108005af1610b3a610937611f3e565b93946040516020810190610c0f81610816846008906763616c6c636f646560c01b81520190565b519020036109f6575f9182915190826108005af21561016f57610b4f92612b54565b3461016f57604036600319011261016f576004356001600160401b03811161016f57610c61903690600401610711565b602435610c6e8183612cc3565b610c76612a62565b604051630fb6accf60e21b81529060208280610c97848730600485016120bd565b03815f6108005af191821561067e575f92610cfe575b505f8260070b1315610cc257610b4f92612b54565b60405162461bcd60e51b81526020600482015260146024820152734661696c656420746f20756e64656c656761746560601b6044820152606490fd5b610d2191925060203d602011610d28575b610d1981836102c0565b81019061210b565b905f610cad565b503d610d0f565b606036600319011261016f57610d43610159565b6024356001600160401b03811161016f575f80610d67610db4933690600401610711565b93604435610d73612a62565b60405163a9059cbb60e01b6020820190815233602483015260448201929092528390610da28160648101610816565b51925af1610dae611f3e565b5061211f565b6040516353266bbb60e01b81529060208280610dd5348530600485016120bd565b03815f6108005af191821561067e57610b4f92610df9915f91610e01575b50612172565b349033612d59565b610e23915060203d602011610e29575b610e1b81836102c0565b81019061215d565b5f610df3565b503d610e11565b90604060031983011261016f576004356001600160a01b038116810361016f5791602435906001600160401b03821161016f576104d091600401610711565b90602082526040610ea4610e8f8351606060208701526080860190610381565b6020840151858203601f190184870152610381565b910151916060601f1982840301910152602080835192838152019201905f5b818110610ed05750505090565b909192602060c060019260a08751805160070b83528481015160070b8584015260408101516040840152606081015160608401526001600160401b036080820151166080840152015160070b60a08201520194019101919091610ec3565b3461016f57610f775f610f4036610e30565b90606060408051610f5081610254565b82815260208101839052015260405163a03ffee160e01b8152938492839260048401611ee1565b03816108005afa801561067e575f90610f9b575b6104429060405191829182610e6f565b503d805f833e610fab81836102c0565b81019060208183031261016f578051906001600160401b03821161016f570160608183031261016f5760405190610fe182610254565b80516001600160401b03811161016f5783610ffd918301611ca5565b825260208101516001600160401b03811161016f578361101e918301611ca5565b60208301526040810151906001600160401b03821161016f57019180601f8401121561016f57825192611050846121b0565b9161105e60405193846102c0565b848352602060c081850196028301019181831161016f57602001945b8286106110935750505061044292506040820152610f8b565b60c08683031261016f57602060c0916040516110ae8161026f565b6110b789611d9b565b81526110c4838a01611d9b565b83820152604089015160408201526060890151606082015260808901516110ea81611a3a565b60808201526110fb60a08a01611d9b565b60a082015281520195019461107a565b602060031982011261016f57600435906001600160401b03821161016f576104d091600401610711565b61113e3661110b565b611146612a62565b6040516353266bbb60e01b81529060208280611167348530600485016120bd565b03815f6108005af191821561067e5761118a92610df9915f91610e015750612172565b5f34156111a3575b5f8080809334903390f11561067e57005b506108fc611192565b6111b53661110b565b610db4612a62565b60606111fc6111ea6111d88451608087526080870190610381565b60208501518682036020880152610381565b60408401518582036040870152610381565b910151916060818303910152602080835192838152019201905f5b8181106112245750505090565b909192602060808261125d600194885160608091805160070b8452602081015160070b6020850152604081015160408501520151910152565b019401929101611217565b9060206104d09281815201906111bd565b3461016f576112e15f6112f361128e3661072c565b6060806040959395516112a08161028a565b81815281602082015281604082015201526040519586948594631f67e4e760e21b865260018060a01b03166004860152606060248601526064850190610381565b83810360031901604485015290610381565b03816108005afa801561067e57610442915f91611318575b5060405191829182611268565b61133491503d805f833e61132c81836102c0565b810190612319565b5f61130b565b3461016f575f36600319011261016f576020600254604051908152f35b908160a091031261016f5790565b3461016f5761010036600319011261016f576004356001600160401b03811161016f57611396903690600401611357565b606036602319011261016f576084356113ad610173565b9160c435916001600160401b03831161016f57610442936113d56113df943690600401610711565b9160e43593612424565b60405190151581529081906020820190565b3461016f57606036600319011261016f576004356001600160401b03811161016f57611421903690600401610711565b60243560443561142f612a62565b5f915f5b335f52600160205260405f205481101561153157335f90815260016020526040902061146590829061019f565b61019f565b5061148686611473836102e1565b6020815191012090602081519101201490565b9081611518575b5061149a57600101611433565b50915060208282946114b16001805b151514612d93565b6114d0604051968793849363096ac6ff60e11b855230600486016124ca565b03815f6108005af192831561067e57610b4f936114f4915f916114f9575b506124fd565b612e45565b611512915060203d602011610e2957610e1b81836102c0565b5f6114ee565b60030154611529915060070b610ae4565b42105f61148d565b50918282946114b160016020946114a9565b3461016f57608036600319011261016f576004356001600160401b03811161016f57611573903690600401611357565b60206115ab611580610189565b9260443593606435604051632943c16b60e21b8152608060048201529586948594608486019061238f565b6001600160a01b0390931660248501526044840152606483015203815f6108005af1801561067e57610442915f916115f1575b5060405190151581529081906020820190565b61160a915060203d602011610e2957610e1b81836102c0565b5f6115de565b9060206001600160401b038161162f8551604086526040860190610381565b9401511691015290565b929160408401936040815282518095526060810194602060608260051b8401019401905f5b81811061167b575050506104d09394506020818403910152611610565b909194602080611697600193605f19888203018c5289516104d3565b9701980191019691909661165e565b3461016f57604036600319011261016f576004356001600160401b03811161016f576116d6903690600401610711565b6024356001600160401b03811161016f576117266116f95f923690600401611357565b92611702611ec8565b50604051938492839263186b216760e01b8452604060048501526044840190610381565b828103600319016024840152608080611750611742858061233e565b60a0865260a086019161236f565b936001600160401b03602082013561176781611a3a565b1660208501526001600160401b03604082013561178381611a3a565b166040850152606081013561179781611a56565b1515606085015201356117a981611a56565b151591015203816108005afa90811561067e575f905f926117d5575b5061044260405192839283611639565b90506117f391503d805f833e6117eb81836102c0565b8101906125a8565b905f6117c5565b3461016f57606036600319011261016f576004356001600160401b03811161016f5761182a903690600401610711565b6024356001600160401b03811161016f57611849903690600401610711565b604435906118578284612cc3565b6040516354b826f560e01b815230600482015260806024820152602081806118976118856084830189610381565b82810360031901604484015286610381565b86606483015203815f6108005af190811561067e57610b4f946118cb5f6118d194879482916118d7575b5060070b1361265e565b33612ebd565b33612d59565b6118f0915060203d602011610d2857610d1981836102c0565b5f6118c1565b6118ff3661110b565b611907612a62565b6040516353266bbb60e01b81529060208280611928348530600485016120bd565b03815f6108005af191821561067e5761194b92610df9915f91610e015750612172565b6002546001810180911161195e57600255005b6120e7565b3461016f5761199a5f61197536610e30565b9061197e611ec8565b5060405163120bba7360e11b8152938492839260048401611ee1565b03816108005afa90811561067e575f905f926119c1575b5061044260405192839283610789565b90506119df91503d805f833e6119d781836102c0565b810190611fb5565b905f6119b1565b805191908290602001825e015f815290565b3461016f576020611a2a81611a0c36610e30565b9060018060a01b03165f525f825260405f20604051938480936119e6565b9081520301902054604051908152f35b6001600160401b0381160361016f57565b359061031982611a3a565b8015150361016f57565b359061031982611a56565b9291604084016040855282518091526060850190602060608260051b8801019401915f905b828210611aad57505050508360206104d094958403910152611610565b90919294605f1988820301825285516020611ad182516040855260408501906111bd565b91015182820360209384015280518083529183019201905f905b808210611b0957505050602080600192970192019201909291611a90565b909192602060a0600192828751611b4583825160608091805160070b8452602081015160070b6020850152604081015160408501520151910152565b01516080820152019401920190611aeb565b3461016f57608036600319011261016f57611b70610159565b6024356001600160401b03811161016f57611b8f903690600401610711565b906044356001600160401b03811161016f57611baf903690600401610711565b606435926001600160401b03841161016f5760a0600319853603011261016f5760405192611bdc84610239565b84600401356001600160401b03811161016f578501943660238701121561016f576084611c5591611c1a611c5f9836906024600482013591016106db565b8752611c2860248201611a4b565b6020880152611c3960448201611a4b565b6040880152611c4a60648201611a60565b606088015201611a60565b6080850152612831565b9061044260405192839283611a6b565b929192611c7b826106c0565b91611c8960405193846102c0565b82948184528183011161016f578281602093845f96015e010152565b9080601f8301121561016f5781516104d092602001611c6f565b519061031982611a56565b5190600482101561016f57565b91909160a08184031261016f57611cec610692565b9281516001600160401b03811161016f5781611d09918401611ca5565b845260208201516001600160401b03811161016f5781611d2a918401611ca5565b602085015260408201516001600160401b03811161016f5781611d4e918401611ca5565b604085015260608201516001600160401b03811161016f5781611d72918401611ca5565b606085015260808201516001600160401b03811161016f57611d949201611ca5565b6080830152565b51908160070b820361016f57565b91906101608382031261016f57611dbe6106a1565b9280516001600160401b03811161016f5782611ddb918301611ca5565b845260208101516001600160401b03811161016f5782611dfc918301611ca5565b6020850152611e0d60408201611cbf565b6040850152611e1e60608201611cca565b60608501526080810151608085015260a081015160a085015260c08101516001600160401b03811161016f5761014092611e59918301611cd7565b60c0850152611e6a60e08201611d9b565b60e0850152611e7c6101008201611d9b565b6101008501526101208101516101208501520151610140830152565b9060208282031261016f5781516001600160401b03811161016f576104d09201611da9565b6040513d5f823e3d90fd5b60405190611ed5826102a5565b5f602083606081520152565b6001600160a01b0390911681526040602082018190526104d092910190610381565b60405190611f126040836102c0565b601a82527f64656c65676174696f6e28616464726573732c737472696e67290000000000006020830152565b3d15611f68573d90611f4f826106c0565b91611f5d60405193846102c0565b82523d5f602084013e565b606090565b15611f7457565b60405162461bcd60e51b81526020600482015260196024820152786661696c65642063616c6c20746f20707265636f6d70696c6560381b6044820152606490fd5b919060408382031261016f578251926020810151906001600160401b03821161016f57019060408282031261016f5760405191611ff1836102a5565b80516001600160401b03811161016f5760209261200f918301611ca5565b83520151602082015290565b1561202257565b60405162461bcd60e51b815260206004820152601f60248201527f6661696c65642073746174696363616c6c20746f20707265636f6d70696c65006044820152606490fd5b1561206e57565b60405162461bcd60e51b815260206004820152602160248201527f6661696c65642064656c656761746563616c6c20746f20707265636f6d70696c6044820152606560f81b6064820152608490fd5b9392916120e29060409260018060a01b03168652606060208701526060860190610381565b930152565b634e487b7160e01b5f52601160045260245ffd5b90621baf80820180921161195e57565b9081602091031261016f576104d090611d9b565b1561212657565b60405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606490fd5b9081602091031261016f57516104d081611a56565b1561217957565b60405162461bcd60e51b815260206004820152600f60248201526e19195b1959d85d194819985a5b1959608a1b6044820152606490fd5b6001600160401b0381116102345760051b60200190565b919082608091031261016f576040516121df8161028a565b60608082946121ed81611d9b565b84526121fb60208201611d9b565b6020850152604081015160408501520151910152565b81601f8201121561016f578051612227816121b0565b9261223560405194856102c0565b81845260208085019260071b8401019281841161016f57602001915b83831061225f575050505090565b602060809161226e84866121c7565b815201920191612251565b91909160808184031261016f5761228e6106b1565b9281516001600160401b03811161016f57816122ab918401611ca5565b845260208201516001600160401b03811161016f57816122cc918401611ca5565b602085015260408201516001600160401b03811161016f57816122f0918401611ca5565b604085015260608201516001600160401b03811161016f576123129201612211565b6060830152565b9060208282031261016f5781516001600160401b03811161016f576104d09201612279565b9035601e198236030181121561016f5701602081359101916001600160401b03821161016f57813603831361016f57565b908060209392818452848401375f828201840152601f01601f1916010190565b6104d09161241661240b6123f06123d56123ba6123ac878061233e565b60a0885260a088019161236f565b6123c7602088018861233e565b90878303602089015261236f565b6123e2604087018761233e565b90868303604088015261236f565b6123fd606086018661233e565b90858303606087015261236f565b92608081019061233e565b91608081850391015261236f565b909361249261245693956020956040519788968796637be6aa8b60e11b8852610100600489015261010488019061238f565b92602435602488015260443560448801526064356064880152608487015260018060a01b031660a48601526003198583030160c4860152610381565b9060e483015203815f6108005af190811561067e575f916124b1575090565b6104d0915060203d602011610e2957610e1b81836102c0565b6001600160a01b039091168152608060208201819052929493926060926124f391830190610381565b9460408201520152565b1561250457565b60405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f2063616e63656c20756e626f6e64696e670000000000006044820152606490fd5b91909160408184031261016f5760405190612563826102a5565b819381516001600160401b03811161016f5782019181601f8401121561016f576125966020939283858095519101611c6f565b84520151916125a483611a3a565b0152565b91909160408184031261016f5780516001600160401b03811161016f57810183601f8201121561016f5780516125dd816121b0565b916125eb60405193846102c0565b81835260208084019260051b8201019186831161016f5760208201905b83821061263157505050509260208201516001600160401b03811161016f576104d09201612549565b81516001600160401b03811161016f576020916126538a848094880101611da9565b815201910190612608565b1561266557565b60405162461bcd60e51b81526020600482015260146024820152734661696c656420746f20726564656c656761746560601b6044820152606490fd5b91909160408184031261016f5780516001600160401b03811161016f57810183601f8201121561016f578051906126d7826121b0565b916126e560405193846102c0565b80835260208084019160051b8301019186831161016f5760208101915b83831061272b57505050509260208201516001600160401b03811161016f576104d09201612549565b82516001600160401b03811161016f5782016040818a03601f19011261016f5760405190612758826102a5565b60208101516001600160401b03811161016f578a602061277a92840101612279565b825260408101516001600160401b03811161016f57602091010189601f8201121561016f5780516127aa816121b0565b916127b860405193846102c0565b818352602060a08185019302820101908c821161016f57602001915b8c8284106127f5575050505091816020938480940152815201920191612702565b8360a091031261016f57602060a0918e61281b60405191612815836102a5565b876121c7565b81526080860151838201528152019201916127d4565b61287a949361288c5f94612843611ec8565b50604051630428a14760e21b81526001600160a01b0390941660048501526080602485015292968794859491906084860190610381565b84810360031901604486015290610381565b6003198382030160648401526080806128ae845160a0855260a0850190610381565b936001600160401b0360208201511660208501526001600160401b0360408201511660408501526060810151151560608501520151151591015203816108005afa91821561067e575f905f9361290357509190565b90506129229192503d805f833e61291a81836102c0565b8101906126a1565b9091565b818110612931575050565b5f8155600101612926565b634e487b7160e01b5f525f60045260245ffd5b906129cb576003816129625f93546101cc565b80612979575b508260018201558260028201550155565b601f811160011461298f57508281555b5f612968565b818452602084206129ab91601f0160051c810190600101612926565b808352826020812080548260011b90831984871b1c191617835555612989565b61293c565b9060405180925f908054906129e4826101cc565b9160018116908115612a3d5750600114612a07575b505060209281520301902090565b9091505f5260205f205f905b828210612a26575050810160205f6129f9565b805482870152859350602090910190600101612a13565b60ff191685525050801515028201905060205f6129f9565b9190820391821161195e57565b5f5b335f52600160205260405f2054811015612b0e5780612a996001926114603360018060a01b03165f52600160205260405f2090565b50600381015460070b421015612ab1575b5001612a64565b335f908152600160205260409020612ad490612ace90849061019f565b9061294f565b612b06612afe8483015492612af83360018060a01b03165f525f60205260405f2090565b906129d0565b918254612a55565b90555f612aaa565b50565b9190601f8111612b2057505050565b610319925f5260205f20906020601f840160051c83019310612b4a575b601f0160051c0190612926565b9091508190612b3d565b909291335f52600160205260405f2060405192612b708461028a565b8352602083019485526040830190438252606084019260070b83528054600160401b81101561023457612ba89160018201815561019f565b9390936129cb57519485516001600160401b03811161023457612bd581612bcf87546101cc565b87612b11565b6020601f8211600114612c4f5791612c1082612c269593600397956103199a9b5f92612c44575b50508160011b915f199060031b1c19161790565b86555b5160018601555160028501555160070b90565b9101906001600160401b0319825416906001600160401b0316179055565b015190505f80612bfc565b601f19821697612c62875f5260205f2090565b985f5b818110612cab5750926103199899600397959360019383612c26999710612c94575b505050811b018655612c13565b01515f19838a1b60f8161c191690555f8080612c87565b838301518b556001909a019960209384019301612c65565b6020612cdf91335f525f825260405f20604051938480936119e6565b908152030190205410612cee57565b60405162461bcd60e51b815260206004820152603b60248201527f44656c65676174696f6e20646f6573206e6f74206578697374206f7220696e7360448201527f756666696369656e742064656c65676174696f6e20616d6f756e7400000000006064820152608490fd5b612d7d9160209160018060a01b03165f525f825260405f20604051938480936119e6565b90815203019020805491820180921161195e5755565b15612d9a57565b60405162461bcd60e51b815260206004820152602360248201527f556e626f6e64696e672064656c65676174696f6e20646f6573206e6f742065786044820152621a5cdd60ea1b6064820152608490fd5b15612df257565b60405162461bcd60e51b815260206004820152602560248201527f616d6f756e74206578636565647320756e626f6e64696e6720656e74727920616044820152641b5bdd5b9d60da1b6064820152608490fd5b90335f52600160205260405f20905f925b8254841015612eb757612e69848461019f565b509080600283015403612eab57506001612e929101918254612e8d82821015612deb565b612a55565b81555415612e9e575050565b61031991612ace9161019f565b93600191500192612e56565b50505050565b9060018060a01b0382165f525f6020528260405f2060206040518092612ee382876119e6565b908152030190205410612f31576020612f1e91612f12612f2d9460018060a01b03165f525f60205260405f2090565b604051938480936119e6565b90815203019020918254612a55565b9055565b60405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742064656c65676174696f6e20616d6f756e7400006044820152606490fdfea26469706673582212208d49d0d1e8f0820033c0b8f7c6ea5a99e5c3bd60ce80408972943227d4d15c6d64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/staking/testdata/StakingCaller.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/staking/testdata/StakingCallerTwo.json b/precompiles/staking/testdata/StakingCallerTwo.json index fca2c09b9..eb716c0e2 100644 --- a/precompiles/staking/testdata/StakingCallerTwo.json +++ b/precompiles/staking/testdata/StakingCallerTwo.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "StakingCallerTwo", "sourceName": "solidity/precompiles/staking/testdata/StakingCallerTwo.sol", "abi": [ @@ -184,8 +184,11 @@ "type": "function" } ], - "bytecode": "0x60808060405234610016576108e6908161001c8239f35b600080fdfe6040608081526004908136101561001557600080fd5b600091823560e01c8063241774e6146105b057806361bc221a146105935783816366dafc7a1461042e57508063b9a6bbca146101ba5763c5b75f011461005a57600080fd5b60603660031901126101b65780356001600160401b0381116101b2576100839036908301610694565b6024359081151582036101ae576044359283151584036101aa576100c692610185575b8451906353266bbb60e01b825281806020958693863491309085016107e6565b0381896108005af190811561017b576101089495916100ec91889161014e575b50610810565b33865260018352828187209151948386809551938492016106db565b82019081520301902061011c348254610851565b90556101255780f35b61012f81546106fe565b815561014b81808080600f335af1610145610723565b50610753565b80f35b61016e9150853d8711610174575b6101668183610642565b8101906107a9565b386100e6565b503d61015c565b85513d88823e3d90fd5b61018f86546106fe565b86556101a586808080600f335af1610145610723565b6100a6565b8580fd5b8480fd5b8380fd5b8280fd5b506003199190610120368401126101b2576001600160401b039181358381116101aa57858184019160a087823603011261042a57606036602319011261042a5760a435966001600160a01b038816968789036101b25760c4359081116101b2576102279036908801610694565b60e4359788151589036101ae57610104928335998a15158b0361042657868c9161040c575b50508751637be6aa8b60e11b81526101008a8201529687958695610270838061085e565b9091880160a090526101a48801906102879261088f565b91610295602483018261085e565b936101031994858a8303016101248b01526102af9261088f565b6102bc604484018361085e565b89830386016101448b01526102d1929161088f565b6102de606484018361085e565b89830386016101648b01526102f3929161088f565b916084016103009161085e565b9092878303016101848801526103159261088f565b91602435602486015260443560448601526064356064860152608435608486015260a48501528382030160c484015261034d916107c1565b3460e483015203815a93610800602095f19081156104025786916103e4575b50156103a1575050829061037d5780f35b808080600f61039c9561039083546106fe565b83555af1610145610723565b388180f35b906020606492519162461bcd60e51b8352820152601e60248201527f4661696c656420746f20637265617465207468652076616c696461746f7200006044820152fd5b6103fc915060203d8111610174576101668183610642565b3861036c565b82513d88823e3d90fd5b808080600f61041f9561039083546106fe565b8a8661024c565b8680fd5b5080fd5b82818560a036600319011261042a57610445610627565b926001600160a01b039160243583811691908290036101ae576044356001600160401b0381116101aa5761047c9036908501610694565b906064359283151584036104265760843594851515860361058f578888886104c697610573575b5050508251906353266bbb60e01b825281806020978893883491309085016107e6565b03818b6108005af19081156105695761050895949392916104ed918a9161054c5750610810565b875260018352828188209151948386809551938492016106db565b82019081520301902061051c348254610851565b9055610526575080f35b8180600f81936105479661053a84546106fe565b8455165af1610145610723565b818180f35b6105639150863d8811610174576101668183610642565b8c6100e6565b83513d8a823e3d90fd5b8180600f81936105879661053a84546106fe565b8888886104a3565b8780fd5b50503461042a578160031936011261042a57602091549051908152f35b50346101b657816003193601126101b6576105c9610627565b906024356001600160401b0381116101ae5791836020956105f1879461061696369101610694565b6001600160a01b039093168152600184522084518251909485938290859087016106db565b820190815203019020549051908152f35b600435906001600160a01b038216820361063d57565b600080fd5b90601f801991011681019081106001600160401b0382111761066357604052565b634e487b7160e01b600052604160045260246000fd5b6001600160401b03811161066357601f01601f191660200190565b81601f8201121561063d578035906106ab82610679565b926106b96040519485610642565b8284526020838301011161063d57816000926020809301838601378301015290565b60005b8381106106ee5750506000910152565b81810151838201526020016106de565b600019811461070d5760010190565b634e487b7160e01b600052601160045260246000fd5b3d1561074e573d9061073482610679565b916107426040519384610642565b82523d6000602084013e565b606090565b1561075a57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b9081602091031261063d5751801515810361063d5790565b906020916107da815180928185528580860191016106db565b601f01601f1916010190565b93929161080b9060409260018060a01b031686526060602087015260608601906107c1565b930152565b1561081757565b60405162461bcd60e51b81526020600482015260126024820152714661696c656420746f2064656c656761746560701b6044820152606490fd5b9190820180921161070d57565b9035601e198236030181121561063d5701602081359101916001600160401b03821161063d57813603831361063d57565b908060209392818452848401376000828201840152601f01601f191601019056fea2646970667358221220350184501da67e3a98092e2f26eaf00d4ee07508f6998e67fcb8e6a420f1682264736f6c63430008140033", - "deployedBytecode": "0x6040608081526004908136101561001557600080fd5b600091823560e01c8063241774e6146105b057806361bc221a146105935783816366dafc7a1461042e57508063b9a6bbca146101ba5763c5b75f011461005a57600080fd5b60603660031901126101b65780356001600160401b0381116101b2576100839036908301610694565b6024359081151582036101ae576044359283151584036101aa576100c692610185575b8451906353266bbb60e01b825281806020958693863491309085016107e6565b0381896108005af190811561017b576101089495916100ec91889161014e575b50610810565b33865260018352828187209151948386809551938492016106db565b82019081520301902061011c348254610851565b90556101255780f35b61012f81546106fe565b815561014b81808080600f335af1610145610723565b50610753565b80f35b61016e9150853d8711610174575b6101668183610642565b8101906107a9565b386100e6565b503d61015c565b85513d88823e3d90fd5b61018f86546106fe565b86556101a586808080600f335af1610145610723565b6100a6565b8580fd5b8480fd5b8380fd5b8280fd5b506003199190610120368401126101b2576001600160401b039181358381116101aa57858184019160a087823603011261042a57606036602319011261042a5760a435966001600160a01b038816968789036101b25760c4359081116101b2576102279036908801610694565b60e4359788151589036101ae57610104928335998a15158b0361042657868c9161040c575b50508751637be6aa8b60e11b81526101008a8201529687958695610270838061085e565b9091880160a090526101a48801906102879261088f565b91610295602483018261085e565b936101031994858a8303016101248b01526102af9261088f565b6102bc604484018361085e565b89830386016101448b01526102d1929161088f565b6102de606484018361085e565b89830386016101648b01526102f3929161088f565b916084016103009161085e565b9092878303016101848801526103159261088f565b91602435602486015260443560448601526064356064860152608435608486015260a48501528382030160c484015261034d916107c1565b3460e483015203815a93610800602095f19081156104025786916103e4575b50156103a1575050829061037d5780f35b808080600f61039c9561039083546106fe565b83555af1610145610723565b388180f35b906020606492519162461bcd60e51b8352820152601e60248201527f4661696c656420746f20637265617465207468652076616c696461746f7200006044820152fd5b6103fc915060203d8111610174576101668183610642565b3861036c565b82513d88823e3d90fd5b808080600f61041f9561039083546106fe565b8a8661024c565b8680fd5b5080fd5b82818560a036600319011261042a57610445610627565b926001600160a01b039160243583811691908290036101ae576044356001600160401b0381116101aa5761047c9036908501610694565b906064359283151584036104265760843594851515860361058f578888886104c697610573575b5050508251906353266bbb60e01b825281806020978893883491309085016107e6565b03818b6108005af19081156105695761050895949392916104ed918a9161054c5750610810565b875260018352828188209151948386809551938492016106db565b82019081520301902061051c348254610851565b9055610526575080f35b8180600f81936105479661053a84546106fe565b8455165af1610145610723565b818180f35b6105639150863d8811610174576101668183610642565b8c6100e6565b83513d8a823e3d90fd5b8180600f81936105879661053a84546106fe565b8888886104a3565b8780fd5b50503461042a578160031936011261042a57602091549051908152f35b50346101b657816003193601126101b6576105c9610627565b906024356001600160401b0381116101ae5791836020956105f1879461061696369101610694565b6001600160a01b039093168152600184522084518251909485938290859087016106db565b820190815203019020549051908152f35b600435906001600160a01b038216820361063d57565b600080fd5b90601f801991011681019081106001600160401b0382111761066357604052565b634e487b7160e01b600052604160045260246000fd5b6001600160401b03811161066357601f01601f191660200190565b81601f8201121561063d578035906106ab82610679565b926106b96040519485610642565b8284526020838301011161063d57816000926020809301838601378301015290565b60005b8381106106ee5750506000910152565b81810151838201526020016106de565b600019811461070d5760010190565b634e487b7160e01b600052601160045260246000fd5b3d1561074e573d9061073482610679565b916107426040519384610642565b82523d6000602084013e565b606090565b1561075a57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b9081602091031261063d5751801515810361063d5790565b906020916107da815180928185528580860191016106db565b601f01601f1916010190565b93929161080b9060409260018060a01b031686526060602087015260608601906107c1565b930152565b1561081757565b60405162461bcd60e51b81526020600482015260126024820152714661696c656420746f2064656c656761746560701b6044820152606490fd5b9190820180921161070d57565b9035601e198236030181121561063d5701602081359101916001600160401b03821161063d57813603831361063d57565b908060209392818452848401376000828201840152601f01601f191601019056fea2646970667358221220350184501da67e3a98092e2f26eaf00d4ee07508f6998e67fcb8e6a420f1682264736f6c63430008140033", + "bytecode": "0x60808060405234601557610874908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c8063241774e61461057557806361bc221a1461055957806366dafc7a14610403578063b9a6bbca1461019e5763c5b75f0114610050575f80fd5b606036600319011261019a576004356001600160401b03811161019a5761007b90369060040161064c565b60243590811515820361019a5760443591821515830361019a57610175575b6040516353266bbb60e01b815290602082806100bb34853060048501610775565b03815f6108005af190811561016a576100e06020939284935f9161013d575b5061079f565b335f526001825260405f20604051938285935191829101845e82019081520301902061010d3482546107e0565b905561011557005b61011f5f54610692565b5f5561013b5f808080600f335af16101356106b4565b506106e3565b005b61015d9150843d8611610163575b61015581836105fc565b810190610739565b5f6100da565b503d61014b565b6040513d5f823e3d90fd5b61017f5f54610692565b5f556101955f808080600f335af16101356106b4565b61009a565b5f80fd5b61012036600319011261019a576004356001600160401b03811161019a578060040160a0600319833603011261019a57606036602319011261019a5760a435916001600160a01b03831680840361019a5760c4356001600160401b03811161019a5761020e90369060040161064c565b60e43593841515850361019a576101043594851515860361019a576020936102f2938861033d936103e9575b506103066040519788968796637be6aa8b60e11b8852610100600489015260846102ea6102c96102a86102868c6101a461027488806107ed565b91909260a0610104820152019161081e565b8c61029460248a01886107ed565b91610124610103198286030191015261081e565b6102b560448801866107ed565b8d830361010319016101448f01529061081e565b6102d660648701856107ed565b8c830361010319016101648e01529061081e565b9301906107ed565b87830361010319016101848901529061081e565b91602435602486015260443560448601526064356064860152608435608486015260a48501526003198483030160c4850152610751565b3460e483015203815f6108005af190811561016a575f916103ca575b50156103855761036557005b5f808080600f61013b956103798354610692565b83555af16101356106b4565b60405162461bcd60e51b815260206004820152601e60248201527f4661696c656420746f20637265617465207468652076616c696461746f7200006044820152606490fd5b6103e3915060203d6020116101635761015581836105fc565b83610359565b5f808080600f6103fd956103798354610692565b8861023a565b60a036600319011261019a576104176105e6565b6024356001600160a01b0381169081900361019a576044356001600160401b03811161019a5761044b90369060040161064c565b60643591821515830361019a5760843592831515840361019a57610529575b6040516353266bbb60e01b8152916020838061048b34853060048501610775565b03815f6108005af191821561016a576104af6020949385945f9161050c575061079f565b5f526001825260405f20604051938285935191829101845e8201908152030190206104db3482546107e0565b90556104e357005b5f808080600f61013b956104f78354610692565b83556001600160a01b03165af16101356106b4565b6105239150853d87116101635761015581836105fc565b886100da565b6105335f54610692565b5f90815561055490808080600f6001600160a01b038a165af16101356106b4565b61046a565b3461019a575f36600319011261019a5760205f54604051908152f35b3461019a57604036600319011261019a5761058e6105e6565b602435906001600160401b03821161019a5760208080926105b385369060040161064c565b9060018060a01b03165f526001825260405f20604051938285935191829101845e82019081520301902054604051908152f35b600435906001600160a01b038216820361019a57565b90601f801991011681019081106001600160401b0382111761061d57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161061d57601f01601f191660200190565b81601f8201121561019a5780359061066382610631565b9261067160405194856105fc565b8284526020838301011161019a57815f926020809301838601378301015290565b5f1981146106a05760010190565b634e487b7160e01b5f52601160045260245ffd5b3d156106de573d906106c582610631565b916106d360405193846105fc565b82523d5f602084013e565b606090565b156106ea57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b9081602091031261019a5751801515810361019a5790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b93929161079a9060409260018060a01b03168652606060208701526060860190610751565b930152565b156107a657565b60405162461bcd60e51b81526020600482015260126024820152714661696c656420746f2064656c656761746560701b6044820152606490fd5b919082018092116106a057565b9035601e198236030181121561019a5701602081359101916001600160401b03821161019a57813603831361019a57565b908060209392818452848401375f828201840152601f01601f191601019056fea2646970667358221220ae9eb2846cdb3a83d200eaeacdf6d85f0ee97c89cc2679cd74d30266e87ec6eb64736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c8063241774e61461057557806361bc221a1461055957806366dafc7a14610403578063b9a6bbca1461019e5763c5b75f0114610050575f80fd5b606036600319011261019a576004356001600160401b03811161019a5761007b90369060040161064c565b60243590811515820361019a5760443591821515830361019a57610175575b6040516353266bbb60e01b815290602082806100bb34853060048501610775565b03815f6108005af190811561016a576100e06020939284935f9161013d575b5061079f565b335f526001825260405f20604051938285935191829101845e82019081520301902061010d3482546107e0565b905561011557005b61011f5f54610692565b5f5561013b5f808080600f335af16101356106b4565b506106e3565b005b61015d9150843d8611610163575b61015581836105fc565b810190610739565b5f6100da565b503d61014b565b6040513d5f823e3d90fd5b61017f5f54610692565b5f556101955f808080600f335af16101356106b4565b61009a565b5f80fd5b61012036600319011261019a576004356001600160401b03811161019a578060040160a0600319833603011261019a57606036602319011261019a5760a435916001600160a01b03831680840361019a5760c4356001600160401b03811161019a5761020e90369060040161064c565b60e43593841515850361019a576101043594851515860361019a576020936102f2938861033d936103e9575b506103066040519788968796637be6aa8b60e11b8852610100600489015260846102ea6102c96102a86102868c6101a461027488806107ed565b91909260a0610104820152019161081e565b8c61029460248a01886107ed565b91610124610103198286030191015261081e565b6102b560448801866107ed565b8d830361010319016101448f01529061081e565b6102d660648701856107ed565b8c830361010319016101648e01529061081e565b9301906107ed565b87830361010319016101848901529061081e565b91602435602486015260443560448601526064356064860152608435608486015260a48501526003198483030160c4850152610751565b3460e483015203815f6108005af190811561016a575f916103ca575b50156103855761036557005b5f808080600f61013b956103798354610692565b83555af16101356106b4565b60405162461bcd60e51b815260206004820152601e60248201527f4661696c656420746f20637265617465207468652076616c696461746f7200006044820152606490fd5b6103e3915060203d6020116101635761015581836105fc565b83610359565b5f808080600f6103fd956103798354610692565b8861023a565b60a036600319011261019a576104176105e6565b6024356001600160a01b0381169081900361019a576044356001600160401b03811161019a5761044b90369060040161064c565b60643591821515830361019a5760843592831515840361019a57610529575b6040516353266bbb60e01b8152916020838061048b34853060048501610775565b03815f6108005af191821561016a576104af6020949385945f9161050c575061079f565b5f526001825260405f20604051938285935191829101845e8201908152030190206104db3482546107e0565b90556104e357005b5f808080600f61013b956104f78354610692565b83556001600160a01b03165af16101356106b4565b6105239150853d87116101635761015581836105fc565b886100da565b6105335f54610692565b5f90815561055490808080600f6001600160a01b038a165af16101356106b4565b61046a565b3461019a575f36600319011261019a5760205f54604051908152f35b3461019a57604036600319011261019a5761058e6105e6565b602435906001600160401b03821161019a5760208080926105b385369060040161064c565b9060018060a01b03165f526001825260405f20604051938285935191829101845e82019081520301902054604051908152f35b600435906001600160a01b038216820361019a57565b90601f801991011681019081106001600160401b0382111761061d57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161061d57601f01601f191660200190565b81601f8201121561019a5780359061066382610631565b9261067160405194856105fc565b8284526020838301011161019a57815f926020809301838601378301015290565b5f1981146106a05760010190565b634e487b7160e01b5f52601160045260245ffd5b3d156106de573d906106c582610631565b916106d360405193846105fc565b82523d5f602084013e565b606090565b156106ea57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b9081602091031261019a5751801515810361019a5790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b93929161079a9060409260018060a01b03168652606060208701526060860190610751565b930152565b156107a657565b60405162461bcd60e51b81526020600482015260126024820152714661696c656420746f2064656c656761746560701b6044820152606490fd5b919082018092116106a057565b9035601e198236030181121561019a5701602081359101916001600160401b03821161019a57813603831361019a57565b908060209392818452848401375f828201840152601f01601f191601019056fea2646970667358221220ae9eb2846cdb3a83d200eaeacdf6d85f0ee97c89cc2679cd74d30266e87ec6eb64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/staking/testdata/StakingCallerTwo.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/staking/tx.go b/precompiles/staking/tx.go index 6ab7996e6..6c968db97 100644 --- a/precompiles/staking/tx.go +++ b/precompiles/staking/tx.go @@ -1,16 +1,15 @@ package staking import ( - "errors" "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - cmn "github.com/cosmos/evm/precompiles/common" - sdk "github.com/cosmos/cosmos-sdk/types" + cmn "github.com/cosmos/evm/precompiles/common" ) const ( @@ -42,7 +41,7 @@ func (p Precompile) CreateValidator( ) ([]byte, error) { bondDenom, err := p.stakingKeeper.BondDenom(ctx) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrBondDenomQueryFailed, err.Error()) } msg, validatorHexAddr, err := NewMsgCreateValidator(args, bondDenom, p.addrCdc) if err != nil { @@ -67,16 +66,16 @@ func (p Precompile) CreateValidator( _, delegated := ethtypes.ParseDelegation(code) if len(code) > 0 && !delegated { // call by contract method - return nil, errors.New(ErrCannotCallFromContract) + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrCannotCallFromContract, msgSender, big.NewInt(int64(len(code))), delegated) } if msgSender != validatorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), validatorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, validatorHexAddr) } // Execute the transaction using the message server if _, err = p.stakingMsgServer.CreateValidator(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, CreateValidatorMethod, err.Error()) } // Here we don't add journal entries here because calls from @@ -84,7 +83,7 @@ func (p Precompile) CreateValidator( // Emit the event for the create validator transaction if err = p.EmitCreateValidatorEvent(ctx, stateDB, msg, validatorHexAddr); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, CreateValidatorMethod, err.Error()) } return method.Outputs.Pack(true) @@ -119,21 +118,21 @@ func (p Precompile) EditValidator( _, delegated := ethtypes.ParseDelegation(code) if len(code) > 0 && !delegated { // call by contract method - return nil, errors.New(ErrCannotCallFromContract) + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrCannotCallFromContract, msgSender, big.NewInt(int64(len(code))), delegated) } if msgSender != validatorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), validatorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, validatorHexAddr) } // Execute the transaction using the message server if _, err = p.stakingMsgServer.EditValidator(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, EditValidatorMethod, err.Error()) } // Emit the event for the edit validator transaction if err = p.EmitEditValidatorEvent(ctx, stateDB, msg, validatorHexAddr); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, EditValidatorMethod, err.Error()) } return method.Outputs.Pack(true) @@ -149,7 +148,7 @@ func (p *Precompile) Delegate( ) ([]byte, error) { bondDenom, err := p.stakingKeeper.BondDenom(ctx) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrBondDenomQueryFailed, err.Error()) } msg, delegatorHexAddr, err := NewMsgDelegate(args, bondDenom, p.addrCdc) if err != nil { @@ -169,17 +168,17 @@ func (p *Precompile) Delegate( msgSender := contract.Caller() if msgSender != delegatorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), delegatorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, delegatorHexAddr) } // Execute the transaction using the message server if _, err = p.stakingMsgServer.Delegate(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, DelegateMethod, err.Error()) } // Emit the event for the delegate transaction if err = p.EmitDelegateEvent(ctx, stateDB, msg, delegatorHexAddr); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, DelegateMethod, err.Error()) } return method.Outputs.Pack(true) @@ -196,7 +195,7 @@ func (p Precompile) Undelegate( ) ([]byte, error) { bondDenom, err := p.stakingKeeper.BondDenom(ctx) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrBondDenomQueryFailed, err.Error()) } msg, delegatorHexAddr, err := NewMsgUndelegate(args, bondDenom, p.addrCdc) if err != nil { @@ -216,18 +215,18 @@ func (p Precompile) Undelegate( msgSender := contract.Caller() if msgSender != delegatorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), delegatorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, delegatorHexAddr) } // Execute the transaction using the message server res, err := p.stakingMsgServer.Undelegate(ctx, msg) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, UndelegateMethod, err.Error()) } // Emit the event for the undelegate transaction if err = p.EmitUnbondEvent(ctx, stateDB, msg, delegatorHexAddr, res.CompletionTime.UTC().Unix()); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, UndelegateMethod, err.Error()) } return method.Outputs.Pack(res.CompletionTime.UTC().Unix()) @@ -245,7 +244,7 @@ func (p Precompile) Redelegate( ) ([]byte, error) { bondDenom, err := p.stakingKeeper.BondDenom(ctx) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrBondDenomQueryFailed, err.Error()) } msg, delegatorHexAddr, err := NewMsgRedelegate(args, bondDenom, p.addrCdc) if err != nil { @@ -266,16 +265,16 @@ func (p Precompile) Redelegate( msgSender := contract.Caller() if msgSender != delegatorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), delegatorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, delegatorHexAddr) } res, err := p.stakingMsgServer.BeginRedelegate(ctx, msg) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, RedelegateMethod, err.Error()) } if err = p.EmitRedelegateEvent(ctx, stateDB, msg, delegatorHexAddr, res.CompletionTime.UTC().Unix()); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, RedelegateMethod, err.Error()) } return method.Outputs.Pack(res.CompletionTime.UTC().Unix()) @@ -293,7 +292,7 @@ func (p Precompile) CancelUnbondingDelegation( ) ([]byte, error) { bondDenom, err := p.stakingKeeper.BondDenom(ctx) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, SolidityErrBondDenomQueryFailed, err.Error()) } msg, delegatorHexAddr, err := NewMsgCancelUnbondingDelegation(args, bondDenom, p.addrCdc) if err != nil { @@ -314,15 +313,15 @@ func (p Precompile) CancelUnbondingDelegation( msgSender := contract.Caller() if msgSender != delegatorHexAddr { - return nil, fmt.Errorf(cmn.ErrRequesterIsNotMsgSender, msgSender.String(), delegatorHexAddr.String()) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrRequesterIsNotMsgSender, msgSender, delegatorHexAddr) } if _, err = p.stakingMsgServer.CancelUnbondingDelegation(ctx, msg); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, CancelUnbondingDelegationMethod, err.Error()) } if err = p.EmitCancelUnbondingDelegationEvent(ctx, stateDB, msg, delegatorHexAddr); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, CancelUnbondingDelegationMethod, err.Error()) } return method.Outputs.Pack(true) diff --git a/precompiles/staking/types.go b/precompiles/staking/types.go index 090b94f7f..2bb0c2ba8 100644 --- a/precompiles/staking/types.go +++ b/precompiles/staking/types.go @@ -3,7 +3,6 @@ package staking import ( "bytes" "encoding/base64" - "errors" "fmt" "math/big" @@ -107,58 +106,58 @@ type Commission = struct { // on the given arguments before populating the message. func NewMsgCreateValidator(args []interface{}, denom string, addrCdc address.Codec) (*stakingtypes.MsgCreateValidator, common.Address, error) { if len(args) != 6 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 6, len(args)) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(6), big.NewInt(int64(len(args)))) } description, ok := args[0].(Description) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidDescription, args[0]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidDescription, fmt.Sprintf("%v", args[0])) } commission, ok := args[1].(Commission) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidCommission, args[1]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidCommission, fmt.Sprintf("%v", args[1])) } minSelfDelegation, ok := args[2].(*big.Int) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidAmount, args[2]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[2])) } validatorAddress, ok := args[3].(common.Address) if !ok || validatorAddress == (common.Address{}) { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidValidator, args[3]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[3])) } // use cli `evmd comet show-validator` get pubkey pubkeyBase64Str, ok := args[4].(string) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "pubkey", "string", args[4]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[4])) } pubkeyBytes, err := base64.StdEncoding.DecodeString(pubkeyBase64Str) if err != nil { - return nil, common.Address{}, err + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidPubkey, fmt.Sprintf("%v", err)) } // more details see https://github.com/cosmos/cosmos-sdk/pull/18506 if len(pubkeyBytes) != ed25519.PubKeySize { - return nil, common.Address{}, fmt.Errorf("consensus pubkey len is invalid, got: %d, expected: %d", len(pubkeyBytes), ed25519.PubKeySize) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidPubkeySize, big.NewInt(int64(len(pubkeyBytes))), big.NewInt(ed25519.PubKeySize)) } var ed25519pk cryptotypes.PubKey = &ed25519.PubKey{Key: pubkeyBytes} pubkey, err := codectypes.NewAnyWithValue(ed25519pk) if err != nil { - return nil, common.Address{}, err + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidPubkey, fmt.Sprintf("%v", err)) } value, ok := args[5].(*big.Int) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidAmount, args[5]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[5])) } delegatorAddr, err := addrCdc.BytesToString(validatorAddress.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &stakingtypes.MsgCreateValidator{ Description: stakingtypes.Description{ @@ -187,22 +186,22 @@ func NewMsgCreateValidator(args []interface{}, denom string, addrCdc address.Cod // on the given arguments before populating the message. func NewMsgEditValidator(args []interface{}) (*stakingtypes.MsgEditValidator, common.Address, error) { if len(args) != 4 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(int64(len(args)))) } description, ok := args[0].(Description) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidDescription, args[0]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidDescription, fmt.Sprintf("%v", args[0])) } validatorHexAddr, ok := args[1].(common.Address) if !ok || validatorHexAddr == (common.Address{}) { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidValidator, args[1]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } commissionRateBigInt, ok := args[2].(*big.Int) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "commissionRate", &big.Int{}, args[2]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[2])) } // The default value of a variable declared using a pointer is nil, indicating that the user does not want to modify its value. @@ -215,7 +214,7 @@ func NewMsgEditValidator(args []interface{}) (*stakingtypes.MsgEditValidator, co minSelfDelegationBigInt, ok := args[3].(*big.Int) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "minSelfDelegation", &big.Int{}, args[3]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[3])) } var minSelfDelegation *math.Int @@ -250,7 +249,7 @@ func NewMsgDelegate(args []interface{}, denom string, addrCdc address.Codec) (*s delegatorAddrStr, err := addrCdc.BytesToString(delegatorAddr.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &stakingtypes.MsgDelegate{ DelegatorAddress: delegatorAddrStr, @@ -274,7 +273,7 @@ func NewMsgUndelegate(args []interface{}, denom string, addrCdc address.Codec) ( delegatorAddrStr, err := addrCdc.BytesToString(delegatorAddr.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &stakingtypes.MsgUndelegate{ DelegatorAddress: delegatorAddrStr, @@ -292,32 +291,32 @@ func NewMsgUndelegate(args []interface{}, denom string, addrCdc address.Codec) ( // on the given arguments before populating the message. func NewMsgRedelegate(args []interface{}, denom string, addrCdc address.Codec) (*stakingtypes.MsgBeginRedelegate, common.Address, error) { if len(args) != 4 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(int64(len(args)))) } delegatorAddr, ok := args[0].(common.Address) if !ok || delegatorAddr == (common.Address{}) { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } - validatorSrcAddress, ok := args[1].(string) - if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "validatorSrcAddress", "string", args[1]) + validatorSrcAddress, _ := args[1].(string) + if _, err := sdk.ValAddressFromBech32(validatorSrcAddress); err != nil { + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } validatorDstAddress, ok := args[2].(string) - if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "validatorDstAddress", "string", args[2]) + if _, err := sdk.ValAddressFromBech32(validatorDstAddress); err != nil { + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[2])) } amount, ok := args[3].(*big.Int) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidAmount, args[3]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[3])) } delegatorAddrStr, err := addrCdc.BytesToString(delegatorAddr.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &stakingtypes.MsgBeginRedelegate{ DelegatorAddress: delegatorAddrStr, @@ -336,32 +335,32 @@ func NewMsgRedelegate(args []interface{}, denom string, addrCdc address.Codec) ( // on the given arguments before populating the message. func NewMsgCancelUnbondingDelegation(args []interface{}, denom string, addrCdc address.Codec) (*stakingtypes.MsgCancelUnbondingDelegation, common.Address, error) { if len(args) != 4 { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(int64(len(args)))) } delegatorAddr, ok := args[0].(common.Address) if !ok || delegatorAddr == (common.Address{}) { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } validatorAddress, ok := args[1].(string) - if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidType, "validatorAddress", "string", args[1]) + if _, err := sdk.ValAddressFromBech32(validatorAddress); err != nil { + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } amount, ok := args[2].(*big.Int) if !ok { - return nil, common.Address{}, fmt.Errorf(cmn.ErrInvalidAmount, args[2]) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[2])) } creationHeight, ok := args[3].(*big.Int) if !ok { - return nil, common.Address{}, fmt.Errorf("invalid creation height") + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidHeight, fmt.Sprintf("%v", args[3])) } delegatorAddrStr, err := addrCdc.BytesToString(delegatorAddr.Bytes()) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, common.Address{}, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } msg := &stakingtypes.MsgCancelUnbondingDelegation{ DelegatorAddress: delegatorAddrStr, @@ -380,22 +379,22 @@ func NewMsgCancelUnbondingDelegation(args []interface{}, denom string, addrCdc a // on the given arguments before populating the request. func NewDelegationRequest(args []interface{}, addrCdc address.Codec) (*stakingtypes.QueryDelegationRequest, error) { if len(args) != 2 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } delegatorAddr, ok := args[0].(common.Address) if !ok || delegatorAddr == (common.Address{}) { - return nil, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } validatorAddress, ok := args[1].(string) - if !ok { - return nil, fmt.Errorf(cmn.ErrInvalidType, "validatorAddress", "string", args[1]) + if _, err := sdk.ValAddressFromBech32(validatorAddress); err != nil { + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } delegatorAddrStr, err := addrCdc.BytesToString(delegatorAddr.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } return &stakingtypes.QueryDelegationRequest{ DelegatorAddr: delegatorAddrStr, @@ -407,12 +406,12 @@ func NewDelegationRequest(args []interface{}, addrCdc address.Codec) (*stakingty // on the given arguments before populating the request. func NewValidatorRequest(args []interface{}) (*stakingtypes.QueryValidatorRequest, error) { if len(args) != 1 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 1, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) } validatorHexAddr, ok := args[0].(common.Address) if !ok || validatorHexAddr == (common.Address{}) { - return nil, fmt.Errorf(cmn.ErrInvalidValidator, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } validatorAddress := sdk.ValAddress(validatorHexAddr.Bytes()).String() @@ -424,7 +423,7 @@ func NewValidatorRequest(args []interface{}) (*stakingtypes.QueryValidatorReques // on the given arguments before populating the request. func NewValidatorsRequest(method *abi.Method, args []interface{}) (*stakingtypes.QueryValidatorsRequest, error) { if len(args) != 2 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } var input ValidatorsInput @@ -446,32 +445,26 @@ func NewValidatorsRequest(method *abi.Method, args []interface{}) (*stakingtypes // on the given arguments before populating the request. func NewRedelegationRequest(args []interface{}) (*RedelegationRequest, error) { if len(args) != 3 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 3, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(int64(len(args)))) } delegatorAddr, ok := args[0].(common.Address) if !ok || delegatorAddr == (common.Address{}) { - return nil, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } - validatorSrcAddress, ok := args[1].(string) - if !ok { - return nil, fmt.Errorf(cmn.ErrInvalidType, "validatorSrcAddress", "string", args[1]) + validatorSrcAddress, _ := args[1].(string) + var validatorSrcAddr sdk.ValAddress + var err error + if validatorSrcAddr, err = sdk.ValAddressFromBech32(validatorSrcAddress); err != nil { + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } - validatorSrcAddr, err := sdk.ValAddressFromBech32(validatorSrcAddress) - if err != nil { - return nil, err - } + var validatorDstAddr sdk.ValAddress validatorDstAddress, ok := args[2].(string) - if !ok { - return nil, fmt.Errorf(cmn.ErrInvalidType, "validatorDstAddress", "string", args[2]) - } - - validatorDstAddr, err := sdk.ValAddressFromBech32(validatorDstAddress) - if err != nil { - return nil, err + if validatorDstAddr, err = sdk.ValAddressFromBech32(validatorDstAddress); err != nil { + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[2])) } return &RedelegationRequest{ @@ -485,7 +478,7 @@ func NewRedelegationRequest(args []interface{}) (*RedelegationRequest, error) { // on the given arguments before populating the request. func NewRedelegationsRequest(method *abi.Method, args []interface{}, addrCdc address.Codec) (*stakingtypes.QueryRedelegationsRequest, error) { if len(args) != 4 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 4, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(int64(len(args)))) } // delAddr, srcValAddr & dstValAddr @@ -495,7 +488,7 @@ func NewRedelegationsRequest(method *abi.Method, args []interface{}, addrCdc add // the delegator address or the source validator address var input RedelegationsInput if err := method.Inputs.Copy(&input, args); err != nil { - return nil, fmt.Errorf("error while unpacking args to RedelegationsInput struct: %s", err) + return nil, cmn.NewRevertWithSolidityError(ABI, SolidityErrRedelegationsInputUnpackFailed, err.Error()) } var ( @@ -508,13 +501,15 @@ func NewRedelegationsRequest(method *abi.Method, args []interface{}, addrCdc add var err error delegatorAddr, err = addrCdc.BytesToString(input.DelegatorAddress.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) } } - if delegatorAddr == "" && input.SrcValidatorAddress == "" && input.DstValidatorAddress == "" || - delegatorAddr == "" && input.SrcValidatorAddress == "" && input.DstValidatorAddress != "" { - return nil, errors.New("invalid query. Need to specify at least a source validator address or delegator address") + if delegatorAddr == "" && input.SrcValidatorAddress == "" && input.DstValidatorAddress == "" { + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "all filter addresses empty") + } + if delegatorAddr == "" && input.SrcValidatorAddress == "" && input.DstValidatorAddress != "" { + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "destination validator set without delegator or source validator") } return &stakingtypes.QueryRedelegationsRequest{ @@ -823,22 +818,22 @@ func (ro *RedelegationsOutput) Pack(args abi.Arguments) ([]byte, error) { // on the given arguments before populating the request. func NewUnbondingDelegationRequest(args []interface{}, addrCdc address.Codec) (*stakingtypes.QueryUnbondingDelegationRequest, error) { if len(args) != 2 { - return nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 2, len(args)) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(int64(len(args)))) } delegatorAddr, ok := args[0].(common.Address) if !ok || delegatorAddr == (common.Address{}) { - return nil, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } - validatorAddress, ok := args[1].(string) - if !ok { - return nil, fmt.Errorf(cmn.ErrInvalidType, "validatorAddress", "string", args[1]) + validatorAddress, _ := args[1].(string) + if _, err := sdk.ValAddressFromBech32(validatorAddress); err != nil { + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } delegatorAddrStr, err := addrCdc.BytesToString(delegatorAddr.Bytes()) if err != nil { - return nil, fmt.Errorf("failed to decode delegator address: %w", err) + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", delegatorAddr.String())) } return &stakingtypes.QueryUnbondingDelegationRequest{ DelegatorAddr: delegatorAddrStr, @@ -849,22 +844,22 @@ func NewUnbondingDelegationRequest(args []interface{}, addrCdc address.Codec) (* // checkDelegationUndelegationArgs checks the arguments for the delegation and undelegation functions. func checkDelegationUndelegationArgs(args []interface{}) (common.Address, string, *big.Int, error) { if len(args) != 3 { - return common.Address{}, "", nil, fmt.Errorf(cmn.ErrInvalidNumberOfArgs, 3, len(args)) + return common.Address{}, "", nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(int64(len(args)))) } delegatorAddr, ok := args[0].(common.Address) if !ok || delegatorAddr == (common.Address{}) { - return common.Address{}, "", nil, fmt.Errorf(cmn.ErrInvalidDelegator, args[0]) + return common.Address{}, "", nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[0])) } - validatorAddress, ok := args[1].(string) - if !ok { - return common.Address{}, "", nil, fmt.Errorf(cmn.ErrInvalidType, "validatorAddress", "string", args[1]) + validatorAddress, _ := args[1].(string) + if _, err := sdk.ValAddressFromBech32(validatorAddress); err != nil { + return common.Address{}, "", nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", args[1])) } amount, ok := args[2].(*big.Int) if !ok { - return common.Address{}, "", nil, fmt.Errorf(cmn.ErrInvalidAmount, args[2]) + return common.Address{}, "", nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[2])) } return delegatorAddr, validatorAddress, amount, nil diff --git a/precompiles/staking/types_test.go b/precompiles/staking/types_test.go index 8a7d609c8..61721084f 100644 --- a/precompiles/staking/types_test.go +++ b/precompiles/staking/types_test.go @@ -1,22 +1,21 @@ package staking import ( - "fmt" "math/big" "testing" "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" evmaddress "github.com/cosmos/evm/encoding/address" cmn "github.com/cosmos/evm/precompiles/common" - - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/evm/precompiles/testutil" ) const ( denom = "stake" - validatorAddr = "cosmosvaloper1qypqxpq9qcrsszg2pvxq6rs0zqg3yyc5a3kaax" + validatorAddr = "cosmosvaloper1qqqqhe5pnaq5qq39wqkn957aydnrm45s2xz032" ) func TestNewMsgCreateValidator(t *testing.T) { @@ -46,7 +45,7 @@ func TestNewMsgCreateValidator(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegatorAddr string wantValidatorAddr string wantMinSelfDel *big.Int @@ -62,58 +61,58 @@ func TestNewMsgCreateValidator(t *testing.T) { wantValue: value, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 6, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(6), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{description, commission, minSelfDelegation, validatorHexAddr, pubkey, value, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 6, 7), + name: "too many arguments", + args: []interface{}{description, commission, minSelfDelegation, validatorHexAddr, pubkey, value, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(6), big.NewInt(7)), }, { - name: "invalid description type", - args: []interface{}{"not-a-description", commission, minSelfDelegation, validatorHexAddr, pubkey, value}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDescription, "not-a-description"), + name: "invalid description type", + args: []interface{}{"not-a-description", commission, minSelfDelegation, validatorHexAddr, pubkey, value}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidDescription, "not-a-description"), }, { - name: "invalid commission type", - args: []interface{}{description, "not-a-commission", minSelfDelegation, validatorHexAddr, pubkey, value}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidCommission, "not-a-commission"), + name: "invalid commission type", + args: []interface{}{description, "not-a-commission", minSelfDelegation, validatorHexAddr, pubkey, value}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, SolidityErrInvalidCommission, "not-a-commission"), }, { - name: "invalid min self delegation type", - args: []interface{}{description, commission, "not-a-big-int", validatorHexAddr, pubkey, value}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidAmount, "not-a-big-int"), + name: "invalid min self delegation type", + args: []interface{}{description, commission, "not-a-big-int", validatorHexAddr, pubkey, value}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, "not-a-big-int"), }, { - name: "invalid validator address type", - args: []interface{}{description, commission, minSelfDelegation, "not-an-address", pubkey, value}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidValidator, "not-an-address"), + name: "invalid validator address type", + args: []interface{}{description, commission, minSelfDelegation, "not-an-address", pubkey, value}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty validator address", - args: []interface{}{description, commission, minSelfDelegation, common.Address{}, pubkey, value}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidValidator, common.Address{}), + name: "empty validator address", + args: []interface{}{description, commission, minSelfDelegation, common.Address{}, pubkey, value}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid pubkey type", - args: []interface{}{description, commission, minSelfDelegation, validatorHexAddr, 123, value}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidType, "pubkey", "string", 123), + name: "invalid pubkey type", + args: []interface{}{description, commission, minSelfDelegation, validatorHexAddr, 123, value}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "123"), }, { - name: "invalid value type", - args: []interface{}{description, commission, minSelfDelegation, validatorHexAddr, pubkey, "not-a-big-int"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidAmount, "not-a-big-int"), + name: "invalid value type", + args: []interface{}{description, commission, minSelfDelegation, validatorHexAddr, pubkey, "not-a-big-int"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, "not-a-big-int"), }, } @@ -122,8 +121,7 @@ func TestNewMsgCreateValidator(t *testing.T) { msg, returnAddr, err := NewMsgCreateValidator(tt.args, denom, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -152,7 +150,7 @@ func TestNewMsgDelegate(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegatorAddr string wantValidatorAddr string wantAmount *big.Int @@ -166,40 +164,40 @@ func TestNewMsgDelegate(t *testing.T) { wantAmount: amount, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{delegatorAddr, validatorAddr, amount, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 4), + name: "too many arguments", + args: []interface{}{delegatorAddr, validatorAddr, amount, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(4)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address", validatorAddr, amount}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address", validatorAddr, amount}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}, validatorAddr, amount}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}, validatorAddr, amount}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid validator address type", - args: []interface{}{delegatorAddr, 123, amount}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidType, "validatorAddress", "string", 123), + name: "invalid validator address type", + args: []interface{}{delegatorAddr, 123, amount}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "123"), }, { - name: "invalid amount type", - args: []interface{}{delegatorAddr, validatorAddr, "not-a-big-int"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidAmount, "not-a-big-int"), + name: "invalid amount type", + args: []interface{}{delegatorAddr, validatorAddr, "not-a-big-int"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, "not-a-big-int"), }, } @@ -208,8 +206,7 @@ func TestNewMsgDelegate(t *testing.T) { msg, returnAddr, err := NewMsgDelegate(tt.args, denom, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -237,7 +234,7 @@ func TestNewMsgUndelegate(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegatorAddr string wantValidatorAddr string wantAmount *big.Int @@ -251,40 +248,40 @@ func TestNewMsgUndelegate(t *testing.T) { wantAmount: amount, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{delegatorAddr, validatorAddr, amount, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 4), + name: "too many arguments", + args: []interface{}{delegatorAddr, validatorAddr, amount, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(4)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address", validatorAddr, amount}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address", validatorAddr, amount}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}, validatorAddr, amount}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}, validatorAddr, amount}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid validator address type", - args: []interface{}{delegatorAddr, 123, amount}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidType, "validatorAddress", "string", 123), + name: "invalid validator address type", + args: []interface{}{delegatorAddr, 123, amount}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "123"), }, { - name: "invalid amount type", - args: []interface{}{delegatorAddr, validatorAddr, "not-a-big-int"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidAmount, "not-a-big-int"), + name: "invalid amount type", + args: []interface{}{delegatorAddr, validatorAddr, "not-a-big-int"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, "not-a-big-int"), }, } @@ -293,8 +290,7 @@ func TestNewMsgUndelegate(t *testing.T) { msg, returnAddr, err := NewMsgUndelegate(tt.args, denom, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -313,8 +309,8 @@ func TestNewMsgRedelegate(t *testing.T) { addrCodec := evmaddress.NewEvmCodec(sdk.GetConfig().GetBech32AccountAddrPrefix()) delegatorAddr := common.HexToAddress("0x1234567890123456789012345678901234567890") - validatorSrcAddr := "cosmosvaloper1qypqxpq9qcrsszg2pvxq6rs0zqg3yyc5a3kaax" - validatorDstAddr := "cosmosvaloper1qypqxpq9qcrsszg2pvxq6rs0zqg3yyc5a3kaay" + validatorSrcAddr := "cosmosvaloper1qqqqhe5pnaq5qq39wqkn957aydnrm45s2xz032" + validatorDstAddr := "cosmosvaloper1qqqqhe5pnaq5qq39wqkn957aydnrm453hsk6vc" amount := big.NewInt(1000000000) expectedDelegatorAddr, err := addrCodec.BytesToString(delegatorAddr.Bytes()) @@ -324,7 +320,7 @@ func TestNewMsgRedelegate(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegatorAddr string wantValidatorSrcAddr string wantValidatorDstAddr string @@ -340,46 +336,46 @@ func TestNewMsgRedelegate(t *testing.T) { wantAmount: amount, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{delegatorAddr, validatorSrcAddr, validatorDstAddr, amount, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 5), + name: "too many arguments", + args: []interface{}{delegatorAddr, validatorSrcAddr, validatorDstAddr, amount, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(5)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address", validatorSrcAddr, validatorDstAddr, amount}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address", validatorSrcAddr, validatorDstAddr, amount}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}, validatorSrcAddr, validatorDstAddr, amount}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}, validatorSrcAddr, validatorDstAddr, amount}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid validator src address type", - args: []interface{}{delegatorAddr, 123, validatorDstAddr, amount}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidType, "validatorSrcAddress", "string", 123), + name: "invalid validator src address type", + args: []interface{}{delegatorAddr, 123, validatorDstAddr, amount}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "123"), }, { - name: "invalid validator dst address type", - args: []interface{}{delegatorAddr, validatorSrcAddr, 123, amount}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidType, "validatorDstAddress", "string", 123), + name: "invalid validator dst address type", + args: []interface{}{delegatorAddr, validatorSrcAddr, 123, amount}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "123"), }, { - name: "invalid amount type", - args: []interface{}{delegatorAddr, validatorSrcAddr, validatorDstAddr, "not-a-big-int"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidAmount, "not-a-big-int"), + name: "invalid amount type", + args: []interface{}{delegatorAddr, validatorSrcAddr, validatorDstAddr, "not-a-big-int"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, "not-a-big-int"), }, } @@ -388,8 +384,7 @@ func TestNewMsgRedelegate(t *testing.T) { msg, returnAddr, err := NewMsgRedelegate(tt.args, denom, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -419,7 +414,7 @@ func TestNewMsgCancelUnbondingDelegation(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegatorAddr string wantValidatorAddr string wantAmount *big.Int @@ -435,46 +430,46 @@ func TestNewMsgCancelUnbondingDelegation(t *testing.T) { wantCreationHeight: creationHeight.Int64(), }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{delegatorAddr, validatorAddr, amount, creationHeight, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 5), + name: "too many arguments", + args: []interface{}{delegatorAddr, validatorAddr, amount, creationHeight, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(5)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address", validatorAddr, amount, creationHeight}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address", validatorAddr, amount, creationHeight}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}, validatorAddr, amount, creationHeight}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}, validatorAddr, amount, creationHeight}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid validator address type", - args: []interface{}{delegatorAddr, 123, amount, creationHeight}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidType, "validatorAddress", "string", 123), + name: "invalid validator address type", + args: []interface{}{delegatorAddr, 123, amount, creationHeight}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "123"), }, { - name: "invalid amount type", - args: []interface{}{delegatorAddr, validatorAddr, "not-a-big-int", creationHeight}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidAmount, "not-a-big-int"), + name: "invalid amount type", + args: []interface{}{delegatorAddr, validatorAddr, "not-a-big-int", creationHeight}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAmount, "not-a-big-int"), }, { - name: "invalid creation height type", - args: []interface{}{delegatorAddr, validatorAddr, amount, "not-a-big-int"}, - wantErr: true, - errMsg: "invalid creation height", + name: "invalid creation height type", + args: []interface{}{delegatorAddr, validatorAddr, amount, "not-a-big-int"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidHeight, "not-a-big-int"), }, } @@ -483,8 +478,7 @@ func TestNewMsgCancelUnbondingDelegation(t *testing.T) { msg, returnAddr, err := NewMsgCancelUnbondingDelegation(tt.args, denom, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, msg) } else { require.NoError(t, err) @@ -512,7 +506,7 @@ func TestNewDelegationRequest(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegatorAddr string wantValidatorAddr string }{ @@ -524,34 +518,34 @@ func TestNewDelegationRequest(t *testing.T) { wantValidatorAddr: validatorAddr, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{delegatorAddr, validatorAddr, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 3), + name: "too many arguments", + args: []interface{}{delegatorAddr, validatorAddr, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(3)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address", validatorAddr}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address", validatorAddr}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}, validatorAddr}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}, validatorAddr}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid validator address type", - args: []interface{}{delegatorAddr, 123}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidType, "validatorAddress", "string", 123), + name: "invalid validator address type", + args: []interface{}{delegatorAddr, 123}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "123"), }, } @@ -560,8 +554,7 @@ func TestNewDelegationRequest(t *testing.T) { req, err := NewDelegationRequest(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, req) } else { require.NoError(t, err) @@ -585,7 +578,7 @@ func TestNewUnbondingDelegationRequest(t *testing.T) { name string args []interface{} wantErr bool - errMsg string + wantErrObj error wantDelegatorAddr string wantValidatorAddr string }{ @@ -597,34 +590,34 @@ func TestNewUnbondingDelegationRequest(t *testing.T) { wantValidatorAddr: validatorAddr, }, { - name: "no arguments", - args: []interface{}{}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + name: "no arguments", + args: []interface{}{}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { - name: "too many arguments", - args: []interface{}{delegatorAddr, validatorAddr, "extra"}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 3), + name: "too many arguments", + args: []interface{}{delegatorAddr, validatorAddr, "extra"}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(3)), }, { - name: "invalid delegator type", - args: []interface{}{"not-an-address", validatorAddr}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, "not-an-address"), + name: "invalid delegator type", + args: []interface{}{"not-an-address", validatorAddr}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "not-an-address"), }, { - name: "empty delegator address", - args: []interface{}{common.Address{}, validatorAddr}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidDelegator, common.Address{}), + name: "empty delegator address", + args: []interface{}{common.Address{}, validatorAddr}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { - name: "invalid validator address type", - args: []interface{}{delegatorAddr, 123}, - wantErr: true, - errMsg: fmt.Sprintf(cmn.ErrInvalidType, "validatorAddress", "string", 123), + name: "invalid validator address type", + args: []interface{}{delegatorAddr, 123}, + wantErr: true, + wantErrObj: cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrInvalidAddress, "123"), }, } @@ -633,8 +626,7 @@ func TestNewUnbondingDelegationRequest(t *testing.T) { req, err := NewUnbondingDelegationRequest(tt.args, addrCodec) if tt.wantErr { - require.Error(t, err) - require.Contains(t, err.Error(), tt.errMsg) + testutil.RequireExactError(t, err, tt.wantErrObj) require.Nil(t, req) } else { require.NoError(t, err) diff --git a/precompiles/testutil/contracts/Counter.json b/precompiles/testutil/contracts/Counter.json index 144c81bfe..b45e4de19 100644 --- a/precompiles/testutil/contracts/Counter.json +++ b/precompiles/testutil/contracts/Counter.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "Counter", "sourceName": "solidity/precompiles/testutil/contracts/Counter.sol", "abi": [ @@ -57,8 +57,11 @@ "type": "function" } ], - "bytecode": "0x6080806040523461001a576000805561022190816100208239f35b600080fdfe60806040818152600436101561001457600080fd5b600091823560e01c9081634f2be91f1461015a575080636deebae31461006257638ada066e1461004357600080fd5b3461005e578160031936011261005e57602091549051908152f35b5080fd5b50903461015757806003193601126101575780549180519080820182811067ffffffffffffffff821117610143578152600f82526020916e434f554e5445525f544f4f5f4c4f5760881b8382015284156100ea57507f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b8299293600019019081855551908152a180f35b9192905192839162461bcd60e51b8352816004840152835191826024850152815b83811061012c57505060448094508284010152601f80199101168101030190fd5b80860182015187820160440152869450810161010b565b634e487b7160e01b84526041600452602484fd5b80fd5b919050346101e757826003193601126101e757825460001981146101d357916020917f64a55044d1f2eddebe1b90e8e2853e8e96931cefadbfa0b2ceb34bee360619418360017f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b829960193848855848152a151908152a180f35b634e487b7160e01b84526011600452602484fd5b8280fdfea26469706673582212208cda3063e5b6f9e0bcc39dda3f7fdb292885a257124e36733c773a00c2fa7eb164736f6c63430008140033", - "deployedBytecode": "0x60806040818152600436101561001457600080fd5b600091823560e01c9081634f2be91f1461015a575080636deebae31461006257638ada066e1461004357600080fd5b3461005e578160031936011261005e57602091549051908152f35b5080fd5b50903461015757806003193601126101575780549180519080820182811067ffffffffffffffff821117610143578152600f82526020916e434f554e5445525f544f4f5f4c4f5760881b8382015284156100ea57507f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b8299293600019019081855551908152a180f35b9192905192839162461bcd60e51b8352816004840152835191826024850152815b83811061012c57505060448094508284010152601f80199101168101030190fd5b80860182015187820160440152869450810161010b565b634e487b7160e01b84526041600452602484fd5b80fd5b919050346101e757826003193601126101e757825460001981146101d357916020917f64a55044d1f2eddebe1b90e8e2853e8e96931cefadbfa0b2ceb34bee360619418360017f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b829960193848855848152a151908152a180f35b634e487b7160e01b84526011600452602484fd5b8280fdfea26469706673582212208cda3063e5b6f9e0bcc39dda3f7fdb292885a257124e36733c773a00c2fa7eb164736f6c63430008140033", + "bytecode": "0x608080604052346018575f80556101f1908161001d8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081634f2be91f14610132575080636deebae31461005d57638ada066e1461003d575f80fd5b34610059575f3660031901126100595760205f54604051908152f35b5f80fd5b34610059575f366003190112610059575f5480156040516040810181811067ffffffffffffffff82111761011e57604052600f815260208101916e434f554e5445525f544f4f5f4c4f5760881b83526100e3577f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b8296020845f1901805f55604051908152a1005b60449060405192839162461bcd60e51b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b634e487b7160e01b5f52604160045260245ffd5b34610059575f366003190112610059575f545f1981146101a7577f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b829917f64a55044d1f2eddebe1b90e8e2853e8e96931cefadbfa0b2ceb34bee360619416020600181940192835f55838152a1604051908152a1005b634e487b7160e01b5f52601160045260245ffdfea264697066735822122084b24da340f7a387bb14eb64c66791adcf204a2a41ecf0ad7a109a64290d5c1164736f6c634300081a0033", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c9081634f2be91f14610132575080636deebae31461005d57638ada066e1461003d575f80fd5b34610059575f3660031901126100595760205f54604051908152f35b5f80fd5b34610059575f366003190112610059575f5480156040516040810181811067ffffffffffffffff82111761011e57604052600f815260208101916e434f554e5445525f544f4f5f4c4f5760881b83526100e3577f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b8296020845f1901805f55604051908152a1005b60449060405192839162461bcd60e51b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b634e487b7160e01b5f52604160045260245ffd5b34610059575f366003190112610059575f545f1981146101a7577f938d2ee5be9cfb0f7270ee2eff90507e94b37625d9d2b3a61c97d30a4560b829917f64a55044d1f2eddebe1b90e8e2853e8e96931cefadbfa0b2ceb34bee360619416020600181940192835f55838152a1604051908152a1005b634e487b7160e01b5f52601160045260245ffdfea264697066735822122084b24da340f7a387bb14eb64c66791adcf204a2a41ecf0ad7a109a64290d5c1164736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/testutil/contracts/Counter.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/testutil/contracts/DistributionCaller.json b/precompiles/testutil/contracts/DistributionCaller.json index e9b32c489..1833e3de4 100644 --- a/precompiles/testutil/contracts/DistributionCaller.json +++ b/precompiles/testutil/contracts/DistributionCaller.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "DistributionCaller", "sourceName": "solidity/precompiles/testutil/contracts/DistributionCaller.sol", "abi": [ @@ -1081,8 +1081,11 @@ "type": "function" } ], - "bytecode": "0x60803462000260576020906001600160401b03818301818111838210176200024a5760808301818110838211176200024a57604052602381527f2f636f736d6f732e7374616b696e672e763162657461312e4d736744656c656760408401526261746560e81b60608401528252600092835492600193848655808510620001ce575b509084805280852085925b858410620000a45760405161240b9081620002bc8239f35b8051908151868111620001ba5787918591620000c1865462000265565b948b601f96858882116200017f575b505050839582116001146200011857849582918d926200010c575b5050600019600383901b1c191690841b1785555b019201930192906200008c565b015190503880620000eb565b868c52838c209095601f1983168d5b8181106200016757509086978488959493106200014d575b505050811b018555620000ff565b015160001960f88460031b161c191690553880806200013f565b8289015184558d978b97940193928301920162000127565b828a620001a7945220600589808701821c830193898810620001b0575b01901c0190620002a2565b8b3885620000d0565b935082936200019c565b634e487b7160e01b89526041600452602489fd5b858052848084882092830192015b828110620001ec57505062000081565b87620001f9825462000265565b806200020b575b5050018590620001dc565b601f8082116001146200022557505081555b873862000200565b6200024090848452888420920160051c8201858301620002a2565b818355556200021d565b634e487b7160e01b600052604160045260246000fd5b600080fd5b90600182811c9216801562000297575b60208310146200028157565b634e487b7160e01b600052602260045260246000fd5b91607f169162000275565b818110620002ae575050565b60008155600101620002a256fe6080604081815260048036101561001557600080fd5b600092833560e01c90816301b6800014611b43575080630c05e9e4146119c85780630da847681461199b578063151732ec1461186c578381631b0502071461177e57508063201139a21461172e5780632947221b146115f8578063296c60aa1461155a578063382d823c1461150e57806346e16d34146114e0578063613d4de81461136257806361bc221a146113405780636b7a547c146112b15780636f669da41461127157806378a5dfd114611244578063796b96d2146111e75780637c9db0bb1461119257806388b2d58114610e7257806393574cd114610de9578063963516e414610d58578063ad5c4cdd14610d00578063b2d1788314610b8e578063b6a216ae14610a27578063be4efc57146108c8578063cb85aa0a1461080f578063d0e30db014610800578063d3f831be14610759578063dd987c20146106b9578063ddbfa271146105ba578063e0421e3914610508578063e236c7a6146102fc5763f9ed9b671461018557600080fd5b8290346102f85760803660031901126102f8576101a0611bbf565b6001600160401b03936024358581116102f45760206101c56102109236908701611e4b565b6101cd611efd565b946101d6611f0c565b956102af575b8451630b4ac1e760e21b81526001600160a01b03909116968101879052602481018590529283918291906044830190611dc5565b0381886108015af19182156102a657508491610278575b501561027457610235575080f35b8180600f819361026f966001549061024f8260070b612126565b16906001600160401b031916176001555af1610269612154565b50612184565b388180f35b8280fd5b610299915060203d811161029f575b6102918183611c84565b810190611fd3565b38610227565b503d610287565b513d86823e3d90fd5b6001546102be8160070b612126565b67ffffffffffffffff19909116908a16176001556102ef88808080600f6001600160a01b0387165af1610269612154565b6101dc565b8480fd5b5080fd5b508234610505576020806003193601126102f857610318611bbf565b8451630a97c34560e31b81526001600160a01b039091169381019390935281836024816108015afa9182156104fa57809381936103e8575b50929093918251948386948501908086528451809252606086018360608460051b890101960197915b838310610397578787038589015287806103938989611f37565b0390f35b919360019193959750806103d48198605f198d82030187528b5190836103c4835189845289840190611c13565b9201519084818403910152611d07565b990193019301909288969492979593610379565b935091503d8083853e6103fb8185611c84565b830184848203126102745783516001600160401b03908181116102f45785019482601f870112156102f45785519561043287611e34565b9661043f89519889611c84565b808852858089019160051b830101918583116104f657868101915b8383106104825750505050838101519182116102f45761047b929101612289565b9185610350565b82518681116104f25782018b601f19828a0301126104f2578b51906104a682611c69565b898101518881116104ee57898b6104bf92840101612044565b82528c810151908882116104ee57916104df8a8c80969481960101612289565b8382015281520192019161045a565b8b80fd5b8980fd5b8780fd5b8451903d90823e3d90fd5b80fd5b509034610274576020366003190112610274578282356001600160401b0381116102f85761053b60209136908601611cc0565b9361055d84519586938493631e7271df60e11b85528401526024830190611c13565b0381836108015af19182156105b05783610393949361058b575b505051918291602083526020830190611dc5565b6105a89293503d8091833e6105a08183611c84565b81019061205e565b903880610577565b81513d85823e3d90fd5b509034610274576060366003190112610274576105d5611bbf565b916001600160401b03906024358281116106b5576105f69036908301611cc0565b93604435908382116106b15761061160209236908501611e4b565b92610650600154946106258660070b6121fa565b871667ffffffffffffffff19968716176001558751631758efa960e11b815298899485948501612245565b0381886108015af19384156106a75760209594610688575b50600154916106798360070b61221f565b16911617600155519015158152f35b6106a0919450853d811161029f576102918183611c84565b9238610668565b83513d87823e3d90fd5b8680fd5b8580fd5b5090806003193601126102745781356001600160401b03811161075557610711926106e960209236908301611cc0565b90835194859283926353266bbb60e01b84523090840152606060248401526064830190611c13565b60243560448301520381866108005af190811561074c5750610731575080f35b6107489060203d811161029f576102918183611c84565b5080f35b513d84823e3d90fd5b8380fd5b509034610274576020366003190112610274578282356001600160401b0381116102f85761078c60209136908601611cc0565b936107ae845195869384936342d9696d60e11b85528401526024830190611c13565b03816108015afa9182156105b0578361039394936107db575b505051918291602083526020830190611f37565b6107f89293503d8091833e6107f08183611c84565b810190612350565b9038806107c7565b83806003193601126105055780f35b509190346102f85760203660031901126102f85761082b611bbf565b81516305431f4560e41b81526001600160a01b039091169381019390935281836024816108015afa9182156108bd578092610876575b81516020808252819061039390820186611c13565b9091503d8082853e6108888185611c84565b8301926020818503126102f8578051916001600160401b0383116105055750926108b6916103939401612044565b9038610861565b9051903d90823e3d90fd5b50346102745760603660031901126102745780359163ffffffff831683036107555761091f60206108f7611f1b565b94610900611efd565b956109e7575b835180938192632efe8a5f60e01b8352308884016121da565b0381886108015af19081156109dd5785916109bf575b50156109825750506109445780f35b6001546109538160070b612126565b6001600160401b0316906001600160401b0319161760015561097f81808080600f335af1610269612154565b80f35b906020606492519162461bcd60e51b835282015260176024820152766661696c656420746f20636c61696d207265776172647360481b6044820152fd5b6109d7915060203d811161029f576102918183611c84565b38610935565b82513d87823e3d90fd5b6001546109f68160070b612126565b6001600160401b0316906001600160401b03191617600155610a2287808080600f335af1610269612154565b610906565b508290346102f8576020918260031936011261050557610a45611bbf565b845163a66cb60560e01b81526001600160a01b039091169281019290925280826024816108015afa918215610b82578192610ad5575b5083519280840190808552835180925280868601968360051b870101940192955b828710610aa95785850386f35b909192938280610ac5600193603f198a82030186528851611c13565b9601920196019592919092610a9c565b9091503d8083833e610ae78183611c84565b810183828203126102745781516001600160401b03928382116102f457019080601f8301121561075557815190610b1d82611e34565b93610b2a88519586611c84565b828552868086019360051b850101938285116106b157878101935b858510610b59575050505050509084610a7b565b8451838111610b7e578991610b7386848094870101612044565b815201940193610b45565b8880fd5b508351903d90823e3d90fd5b509034610274576060366003190112610274576001600160401b0382358181116102f457610bbf9036908501611cc0565b92610bc8611bda565b916044359081116106b557610be09036908301611cc0565b91835191632d4ecd4b60e11b835282610bfe60209733848401611feb565b0392868161080195818b885af1908115610cf6578891610cd9575b5015610c965791610c42939187809487519687958694859363b46a8d6160e01b85528401611feb565b03925af1938415610c8b578094610c69575b50506103939051928284938452830190611dc5565b61039392945090610c83913d8091833e6105a08183611c84565b929038610c54565b8251903d90823e3d90fd5b845162461bcd60e51b8152908101869052601e60248201527f6661696c656420746f20736574207769746864726177206164647265737300006044820152606490fd5b610cf09150873d891161029f576102918183611c84565b38610c19565b86513d8a823e3d90fd5b5090346102745782610d1136611d83565b93610d2d8451958693849363b46a8d6160e01b85528401611feb565b0381836108015af190811561074c5750610d45575080fd5b6102f8903d8084833e6105a08183611c84565b5090346102745760203660031901126102745781356001600160401b03811161075557610da992610d8e60209236908301611cc0565b8351632d4ecd4b60e11b815294859283929030908401611feb565b0381866108015af19182156105b05760209392610dca575b50519015158152f35b610de2919250833d811161029f576102918183611c84565b9038610dc1565b50346102745781600319360112610274579160209283610e07611bbf565b610e0f611fac565b92610e2b86519485938493632efe8a5f60e01b855284016121da565b0381856108015af1829181610e53575b50610e4b5750905b519015158152f35b905090610e43565b610e6b919250853d811161029f576102918183611c84565b9038610e3b565b508290346102f857600319608036820112610274576001600160401b0382358181116102f457610ea59036908501611cc0565b926024358281168091036106b557604435918383168093036106b1576064358481116104f65780360360a087820112610b7e57895196610ee488611c69565b6060958689528a6020809a0152610f118c519a63479239e760e11b8c526080878d015260848c0190611c13565b9560248b015260448a0152888503016064890152818301359060221901811215610b7e5781019182013591602401858311610b7e578236038113610b7e57878484610fb6608484968f8f9960c098601f9f9e9d9c60a090528160a089015289880137898886880101528b610f8760248401611fbf565b168d8701528b610f9960448401611fbf565b1690860152610faa60648201611f2a565b15158a86015201611f2a565b15156080830152891999018916010301816108015afa9485156111885786948796611054575b5050865187815284518189018190529096878301958501925b82821061102657505050508161101b869787860383890152865190808752860190611c13565b940151169101520390f35b835180518616885286015180518789015286015160ff168a8801529586019592850192600190910190610ff5565b91955093503d8087863e6110688186611c84565b84019387818603126106b15780518381116104f657810185601f820112156104f657805161109581611e34565b936110a28b519586611c84565b8185528689818701930284010192888411611184578701915b838310611127575050505083810151908382116104f6570187818603126106b1578751946110e886611c69565b8151848111610b7e57820181601f82011215610b7e57916111128692848461111a9651910161200d565b875201612375565b8385015292938780610fdc565b8289038a81126104ee578c8381519261113f84611c69565b61114887612375565b845201126104ee578a9189918e61117181519161116483611c69565b858901518352880161227b565b84820152838201528152019201916110bb565b8a80fd5b87513d88823e3d90fd5b509034610274576020366003190112610274578282356001600160401b0381116102f8576111c560209136908601611cc0565b936107ae845195869384936307ba81ef60e31b85528401526024830190611c13565b50508134610505578061097f9261122161122f61120336611d83565b9093519283916020830195632d4ecd4b60e11b875260248401611feb565b03601f198101835282611c84565b51906108015afa61123e612154565b50612389565b509034610274578261125536611d83565b936107ae845195869384936326b558ed60e21b85528401611feb565b509034610274578060031936011261027457602061128d611bbf565b611295611fac565b93610da984519586938493632efe8a5f60e01b855284016121da565b5090346102745780600319360112610274576112cb611bbf565b6001600160401b03906024358281116106b5576112ed60209136908701611e4b565b94600154926112fe8460070b6121fa565b85166001600160401b03198095161760015561065086519788938493630b4ac1e760e21b855260018060a01b0316908401528760248401526044830190611dc5565b5050346102f857816003193601126102f85760209060015460070b9051908152f35b509034610274576080366003190112610274576001600160401b039282358481116102f8576113949036908501611cc0565b9361139d611bda565b908260206113a9611efd565b966113b2611f0c565b97611489575b6113d98751998a938493631e7271df60e11b85528401526024830190611c13565b0381836108015af194851561147f57610393968496611463575b5061140e575b50505051918291602083526020830190611dc5565b6001549061141e8260070b612126565b67ffffffffffffffff199092169116176001556001600160a01b031690308203611449575b806113f9565b808080600f61145c955af1610269612154565b3880611443565b6114789196503d8086833e6105a08183611c84565b94386113f3565b84513d85823e3d90fd5b6001546114988160070b612126565b67ffffffffffffffff19909116908516176001556001600160a01b038516833082036114c6575b50506113b8565b808080600f6114d9955af1610269612154565b38836114bf565b5090346102745760206114f236611d83565b93610da984519586938493632d4ecd4b60e11b85528401611feb565b509034610274578260031936011261027457828151809363014d140b60e41b8252816108015afa9182156105b0578361039394936107db57505051918291602083526020830190611f37565b50903461027457828061159261122161157236611d83565b86939193519283916020830195632d4ecd4b60e11b875260248401611feb565b51906108015af46115a1612154565b50156115ab578280f35b906020608492519162461bcd60e51b8352820152602160248201527f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c6044820152606560f81b6064820152fd5b509034610274576060366003190112610274576001600160401b0382358181116102f457938061162e61165f9636908701611cc0565b611636611f1b565b9561163f611efd565b966116f5575b855163b46a8d6160e01b8152978892839230908401611feb565b0381836108015af19384156116e9576103939582956116cd575b5061169257505051918291602083526020830190611dc5565b6116c691600154906116a68260070b612126565b16906001600160401b03191617600155808080600f335af1610269612154565b3880610577565b6116e29195503d8084833e6105a08183611c84565b9338611679565b508251903d90823e3d90fd5b6001546117048160070b612126565b8616906001600160401b0319161760015561172983808080600f335af1610269612154565b611645565b50903461027457602036600319011261027457828235926001600160401b0384116102f85761176361055d9436908301611cc0565b835163b46a8d6160e01b815294859283929030908401611feb565b828185346102f85760803660031901126102f85761179a611bbf565b6117a2611bda565b936001600160401b03926044358481116106b5576117c4869136908501611cc0565b916117cd611f0c565b936117ff8251948593849363ad5c4cdd60e01b855260018060a01b03809a169085015260248401526044830190611c13565b038183305af1611852575b50611813578280f35b82600f81939261184a9683946001549061182f8260070b612126565b16906001600160401b03191617600155165af1610269612154565b818181808280f35b611865903d8087833e6105a08183611c84565b508661180a565b5034610274576080366003190112610274576001600160401b039181358381116102f45761189d9036908401611cc0565b6024358481116106b5576118b660209136908601611e4b565b916118bf611efd565b946118c8611f0c565b95611962575b6118eb85519485938493631758efa960e11b855230908501612245565b0381886108015af19182156102a657508491611944575b501561027457611910575080f35b600154906119208260070b612126565b16906001600160401b0319161760015561097f81808080600f335af1610269612154565b61195c915060203d811161029f576102918183611c84565b38611902565b6001546119718160070b612126565b8816906001600160401b0319161760015561199688808080600f335af1610269612154565b6118ce565b50903461027457826119ac36611d83565b9361055d8451958693849363b46a8d6160e01b85528401611feb565b50346102745760209081600319360112610755578035936001600160401b03918286116102f85781846119ff879836908501611cc0565b928751611a0b81611c38565b606099818b80935282858201520152611a3b885194859384936354212a8960e01b85528401526024830190611c13565b03816108015afa928315611b39578293611a9e575b505050610393918351948594828652611a8d611a76855184868a01526080890190611c13565b9385015193601f19948589830301848a0152611d07565b930151918584030190850152611d07565b909192503d8084843e611ab18184611c84565b8201918481840312610755578051908282116102f45701868184031261075557855193611add85611c38565b81518381116102f85784611af2918401612044565b8552858201518381116102f85784611b0b918401612289565b8686015286820151928311610505575091611b2c9161039395949301612289565b8482015290913880611a50565b85513d84823e3d90fd5b9150503461027457602036600319011261027457918061039393611b65611bbf565b6305431f4560e41b602083019081526001600160a01b03909116602480840191909152825290611b9481611c38565b51906108015afa90611bad611ba7612154565b92612389565b51918291602083526020830190611c13565b600435906001600160a01b0382168203611bd557565b600080fd5b602435906001600160a01b0382168203611bd557565b60005b838110611c035750506000910152565b8181015183820152602001611bf3565b90602091611c2c81518092818552858086019101611bf0565b601f01601f1916010190565b606081019081106001600160401b03821117611c5357604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117611c5357604052565b90601f801991011681019081106001600160401b03821117611c5357604052565b6001600160401b038111611c5357601f01601f191660200190565b81601f82011215611bd557803590611cd782611ca5565b92611ce56040519485611c84565b82845260208383010111611bd557816000926020809301838601378301015290565b908082519081815260208091019281808460051b8301019501936000915b848310611d355750505050505090565b9091929394958480600192601f19858203018652895190611d5e82516060808452830190611c13565b91838101518483015260ff604080920151169101529801930193019194939290611d25565b906040600319830112611bd5576004356001600160a01b0381168103611bd55791602435906001600160401b038211611bd557611dc291600401611cc0565b90565b908082519081815260208091019281808460051b8301019501936000915b848310611df35750505050505090565b9091929394958480600192601f198582030186528951908280611e1e84516040808652850190611c13565b9301519101529801930193019194939290611de3565b6001600160401b038111611c535760051b60200190565b81601f82011215611bd5578035611e6181611e34565b92604091611e7183519586611c84565b808552602093848087019260051b82010193838511611bd557858201925b858410611ea0575050505050505090565b6001600160401b03908435828111611bd55784019083601f198389030112611bd5578351611ecd81611c69565b89830135938411611bd5578483611eea8a8d809881980101611cc0565b8352013583820152815201930192611e8f565b604435908115158203611bd557565b606435908115158203611bd557565b602435908115158203611bd557565b35908115158203611bd557565b90815180825260208092019182818360051b82019501936000915b848310611f625750505050505090565b90919293949584808284600194038652895190611f8782516060808452830190611c13565b91838101518483015260ff604080920151169101529801930193019194939290611f52565b6024359063ffffffff82168203611bd557565b35906001600160401b0382168203611bd557565b90816020910312611bd557518015158103611bd55790565b6001600160a01b039091168152604060208201819052611dc292910190611c13565b9092919261201a81611ca5565b916120286040519384611c84565b829482845282820111611bd5576020612042930190611bf0565b565b9080601f83011215611bd5578151611dc29260200161200d565b906020908183820312611bd55782516001600160401b0393848211611bd557019080601f83011215611bd557815161209581611e34565b9460406120a481519788611c84565b828752858088019360051b86010194848611611bd557868101935b8685106120d157505050505050505090565b8451848111611bd557820183601f198289030112611bd5578351916120f583611c69565b8982015192868411611bd55785836121138b8e809881980101612044565b83520151838201528152019401936120bf565b60070b677fffffffffffffff811461213e5760010190565b634e487b7160e01b600052601160045260246000fd5b3d1561217f573d9061216582611ca5565b916121736040519384611c84565b82523d6000602084013e565b606090565b1561218b57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b6001600160a01b03909116815263ffffffff909116602082015260400190565b60070b60010190677fffffffffffffff8213677fffffffffffffff1983121761213e57565b60070b6000190190677fffffffffffffff198212677fffffffffffffff83131761213e57565b6001600160a01b039091168152606060208201819052611dc293919261226d91840190611c13565b916040818403910152611dc5565b519060ff82168203611bd557565b9080601f83011215611bd55781516122a081611e34565b926040916122b083519586611c84565b808552602093848087019260051b84010193818511611bd557858401925b8584106122df575050505050505090565b8351906001600160401b0391828111611bd55786019060609283601f198488030112611bd55784519061231182611c38565b8a840151908111611bd5578a948461233189886123419581990101612044565b845287810151868501520161227b565b858201528152019301926122ce565b90602082820312611bd55781516001600160401b038111611bd557611dc29201612289565b51906001600160401b0382168203611bd557565b1561239057565b60405162461bcd60e51b815260206004820152601f60248201527f6661696c65642073746174696343616c6c20746f20707265636f6d70696c65006044820152606490fdfea2646970667358221220c29b806ba0c5393e3d3328caa418ca6534f2dcf4f200fd01cb544b8d104e1e3564736f6c63430008140033", - "deployedBytecode": "0x6080604081815260048036101561001557600080fd5b600092833560e01c90816301b6800014611b43575080630c05e9e4146119c85780630da847681461199b578063151732ec1461186c578381631b0502071461177e57508063201139a21461172e5780632947221b146115f8578063296c60aa1461155a578063382d823c1461150e57806346e16d34146114e0578063613d4de81461136257806361bc221a146113405780636b7a547c146112b15780636f669da41461127157806378a5dfd114611244578063796b96d2146111e75780637c9db0bb1461119257806388b2d58114610e7257806393574cd114610de9578063963516e414610d58578063ad5c4cdd14610d00578063b2d1788314610b8e578063b6a216ae14610a27578063be4efc57146108c8578063cb85aa0a1461080f578063d0e30db014610800578063d3f831be14610759578063dd987c20146106b9578063ddbfa271146105ba578063e0421e3914610508578063e236c7a6146102fc5763f9ed9b671461018557600080fd5b8290346102f85760803660031901126102f8576101a0611bbf565b6001600160401b03936024358581116102f45760206101c56102109236908701611e4b565b6101cd611efd565b946101d6611f0c565b956102af575b8451630b4ac1e760e21b81526001600160a01b03909116968101879052602481018590529283918291906044830190611dc5565b0381886108015af19182156102a657508491610278575b501561027457610235575080f35b8180600f819361026f966001549061024f8260070b612126565b16906001600160401b031916176001555af1610269612154565b50612184565b388180f35b8280fd5b610299915060203d811161029f575b6102918183611c84565b810190611fd3565b38610227565b503d610287565b513d86823e3d90fd5b6001546102be8160070b612126565b67ffffffffffffffff19909116908a16176001556102ef88808080600f6001600160a01b0387165af1610269612154565b6101dc565b8480fd5b5080fd5b508234610505576020806003193601126102f857610318611bbf565b8451630a97c34560e31b81526001600160a01b039091169381019390935281836024816108015afa9182156104fa57809381936103e8575b50929093918251948386948501908086528451809252606086018360608460051b890101960197915b838310610397578787038589015287806103938989611f37565b0390f35b919360019193959750806103d48198605f198d82030187528b5190836103c4835189845289840190611c13565b9201519084818403910152611d07565b990193019301909288969492979593610379565b935091503d8083853e6103fb8185611c84565b830184848203126102745783516001600160401b03908181116102f45785019482601f870112156102f45785519561043287611e34565b9661043f89519889611c84565b808852858089019160051b830101918583116104f657868101915b8383106104825750505050838101519182116102f45761047b929101612289565b9185610350565b82518681116104f25782018b601f19828a0301126104f2578b51906104a682611c69565b898101518881116104ee57898b6104bf92840101612044565b82528c810151908882116104ee57916104df8a8c80969481960101612289565b8382015281520192019161045a565b8b80fd5b8980fd5b8780fd5b8451903d90823e3d90fd5b80fd5b509034610274576020366003190112610274578282356001600160401b0381116102f85761053b60209136908601611cc0565b9361055d84519586938493631e7271df60e11b85528401526024830190611c13565b0381836108015af19182156105b05783610393949361058b575b505051918291602083526020830190611dc5565b6105a89293503d8091833e6105a08183611c84565b81019061205e565b903880610577565b81513d85823e3d90fd5b509034610274576060366003190112610274576105d5611bbf565b916001600160401b03906024358281116106b5576105f69036908301611cc0565b93604435908382116106b15761061160209236908501611e4b565b92610650600154946106258660070b6121fa565b871667ffffffffffffffff19968716176001558751631758efa960e11b815298899485948501612245565b0381886108015af19384156106a75760209594610688575b50600154916106798360070b61221f565b16911617600155519015158152f35b6106a0919450853d811161029f576102918183611c84565b9238610668565b83513d87823e3d90fd5b8680fd5b8580fd5b5090806003193601126102745781356001600160401b03811161075557610711926106e960209236908301611cc0565b90835194859283926353266bbb60e01b84523090840152606060248401526064830190611c13565b60243560448301520381866108005af190811561074c5750610731575080f35b6107489060203d811161029f576102918183611c84565b5080f35b513d84823e3d90fd5b8380fd5b509034610274576020366003190112610274578282356001600160401b0381116102f85761078c60209136908601611cc0565b936107ae845195869384936342d9696d60e11b85528401526024830190611c13565b03816108015afa9182156105b0578361039394936107db575b505051918291602083526020830190611f37565b6107f89293503d8091833e6107f08183611c84565b810190612350565b9038806107c7565b83806003193601126105055780f35b509190346102f85760203660031901126102f85761082b611bbf565b81516305431f4560e41b81526001600160a01b039091169381019390935281836024816108015afa9182156108bd578092610876575b81516020808252819061039390820186611c13565b9091503d8082853e6108888185611c84565b8301926020818503126102f8578051916001600160401b0383116105055750926108b6916103939401612044565b9038610861565b9051903d90823e3d90fd5b50346102745760603660031901126102745780359163ffffffff831683036107555761091f60206108f7611f1b565b94610900611efd565b956109e7575b835180938192632efe8a5f60e01b8352308884016121da565b0381886108015af19081156109dd5785916109bf575b50156109825750506109445780f35b6001546109538160070b612126565b6001600160401b0316906001600160401b0319161760015561097f81808080600f335af1610269612154565b80f35b906020606492519162461bcd60e51b835282015260176024820152766661696c656420746f20636c61696d207265776172647360481b6044820152fd5b6109d7915060203d811161029f576102918183611c84565b38610935565b82513d87823e3d90fd5b6001546109f68160070b612126565b6001600160401b0316906001600160401b03191617600155610a2287808080600f335af1610269612154565b610906565b508290346102f8576020918260031936011261050557610a45611bbf565b845163a66cb60560e01b81526001600160a01b039091169281019290925280826024816108015afa918215610b82578192610ad5575b5083519280840190808552835180925280868601968360051b870101940192955b828710610aa95785850386f35b909192938280610ac5600193603f198a82030186528851611c13565b9601920196019592919092610a9c565b9091503d8083833e610ae78183611c84565b810183828203126102745781516001600160401b03928382116102f457019080601f8301121561075557815190610b1d82611e34565b93610b2a88519586611c84565b828552868086019360051b850101938285116106b157878101935b858510610b59575050505050509084610a7b565b8451838111610b7e578991610b7386848094870101612044565b815201940193610b45565b8880fd5b508351903d90823e3d90fd5b509034610274576060366003190112610274576001600160401b0382358181116102f457610bbf9036908501611cc0565b92610bc8611bda565b916044359081116106b557610be09036908301611cc0565b91835191632d4ecd4b60e11b835282610bfe60209733848401611feb565b0392868161080195818b885af1908115610cf6578891610cd9575b5015610c965791610c42939187809487519687958694859363b46a8d6160e01b85528401611feb565b03925af1938415610c8b578094610c69575b50506103939051928284938452830190611dc5565b61039392945090610c83913d8091833e6105a08183611c84565b929038610c54565b8251903d90823e3d90fd5b845162461bcd60e51b8152908101869052601e60248201527f6661696c656420746f20736574207769746864726177206164647265737300006044820152606490fd5b610cf09150873d891161029f576102918183611c84565b38610c19565b86513d8a823e3d90fd5b5090346102745782610d1136611d83565b93610d2d8451958693849363b46a8d6160e01b85528401611feb565b0381836108015af190811561074c5750610d45575080fd5b6102f8903d8084833e6105a08183611c84565b5090346102745760203660031901126102745781356001600160401b03811161075557610da992610d8e60209236908301611cc0565b8351632d4ecd4b60e11b815294859283929030908401611feb565b0381866108015af19182156105b05760209392610dca575b50519015158152f35b610de2919250833d811161029f576102918183611c84565b9038610dc1565b50346102745781600319360112610274579160209283610e07611bbf565b610e0f611fac565b92610e2b86519485938493632efe8a5f60e01b855284016121da565b0381856108015af1829181610e53575b50610e4b5750905b519015158152f35b905090610e43565b610e6b919250853d811161029f576102918183611c84565b9038610e3b565b508290346102f857600319608036820112610274576001600160401b0382358181116102f457610ea59036908501611cc0565b926024358281168091036106b557604435918383168093036106b1576064358481116104f65780360360a087820112610b7e57895196610ee488611c69565b6060958689528a6020809a0152610f118c519a63479239e760e11b8c526080878d015260848c0190611c13565b9560248b015260448a0152888503016064890152818301359060221901811215610b7e5781019182013591602401858311610b7e578236038113610b7e57878484610fb6608484968f8f9960c098601f9f9e9d9c60a090528160a089015289880137898886880101528b610f8760248401611fbf565b168d8701528b610f9960448401611fbf565b1690860152610faa60648201611f2a565b15158a86015201611f2a565b15156080830152891999018916010301816108015afa9485156111885786948796611054575b5050865187815284518189018190529096878301958501925b82821061102657505050508161101b869787860383890152865190808752860190611c13565b940151169101520390f35b835180518616885286015180518789015286015160ff168a8801529586019592850192600190910190610ff5565b91955093503d8087863e6110688186611c84565b84019387818603126106b15780518381116104f657810185601f820112156104f657805161109581611e34565b936110a28b519586611c84565b8185528689818701930284010192888411611184578701915b838310611127575050505083810151908382116104f6570187818603126106b1578751946110e886611c69565b8151848111610b7e57820181601f82011215610b7e57916111128692848461111a9651910161200d565b875201612375565b8385015292938780610fdc565b8289038a81126104ee578c8381519261113f84611c69565b61114887612375565b845201126104ee578a9189918e61117181519161116483611c69565b858901518352880161227b565b84820152838201528152019201916110bb565b8a80fd5b87513d88823e3d90fd5b509034610274576020366003190112610274578282356001600160401b0381116102f8576111c560209136908601611cc0565b936107ae845195869384936307ba81ef60e31b85528401526024830190611c13565b50508134610505578061097f9261122161122f61120336611d83565b9093519283916020830195632d4ecd4b60e11b875260248401611feb565b03601f198101835282611c84565b51906108015afa61123e612154565b50612389565b509034610274578261125536611d83565b936107ae845195869384936326b558ed60e21b85528401611feb565b509034610274578060031936011261027457602061128d611bbf565b611295611fac565b93610da984519586938493632efe8a5f60e01b855284016121da565b5090346102745780600319360112610274576112cb611bbf565b6001600160401b03906024358281116106b5576112ed60209136908701611e4b565b94600154926112fe8460070b6121fa565b85166001600160401b03198095161760015561065086519788938493630b4ac1e760e21b855260018060a01b0316908401528760248401526044830190611dc5565b5050346102f857816003193601126102f85760209060015460070b9051908152f35b509034610274576080366003190112610274576001600160401b039282358481116102f8576113949036908501611cc0565b9361139d611bda565b908260206113a9611efd565b966113b2611f0c565b97611489575b6113d98751998a938493631e7271df60e11b85528401526024830190611c13565b0381836108015af194851561147f57610393968496611463575b5061140e575b50505051918291602083526020830190611dc5565b6001549061141e8260070b612126565b67ffffffffffffffff199092169116176001556001600160a01b031690308203611449575b806113f9565b808080600f61145c955af1610269612154565b3880611443565b6114789196503d8086833e6105a08183611c84565b94386113f3565b84513d85823e3d90fd5b6001546114988160070b612126565b67ffffffffffffffff19909116908516176001556001600160a01b038516833082036114c6575b50506113b8565b808080600f6114d9955af1610269612154565b38836114bf565b5090346102745760206114f236611d83565b93610da984519586938493632d4ecd4b60e11b85528401611feb565b509034610274578260031936011261027457828151809363014d140b60e41b8252816108015afa9182156105b0578361039394936107db57505051918291602083526020830190611f37565b50903461027457828061159261122161157236611d83565b86939193519283916020830195632d4ecd4b60e11b875260248401611feb565b51906108015af46115a1612154565b50156115ab578280f35b906020608492519162461bcd60e51b8352820152602160248201527f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c6044820152606560f81b6064820152fd5b509034610274576060366003190112610274576001600160401b0382358181116102f457938061162e61165f9636908701611cc0565b611636611f1b565b9561163f611efd565b966116f5575b855163b46a8d6160e01b8152978892839230908401611feb565b0381836108015af19384156116e9576103939582956116cd575b5061169257505051918291602083526020830190611dc5565b6116c691600154906116a68260070b612126565b16906001600160401b03191617600155808080600f335af1610269612154565b3880610577565b6116e29195503d8084833e6105a08183611c84565b9338611679565b508251903d90823e3d90fd5b6001546117048160070b612126565b8616906001600160401b0319161760015561172983808080600f335af1610269612154565b611645565b50903461027457602036600319011261027457828235926001600160401b0384116102f85761176361055d9436908301611cc0565b835163b46a8d6160e01b815294859283929030908401611feb565b828185346102f85760803660031901126102f85761179a611bbf565b6117a2611bda565b936001600160401b03926044358481116106b5576117c4869136908501611cc0565b916117cd611f0c565b936117ff8251948593849363ad5c4cdd60e01b855260018060a01b03809a169085015260248401526044830190611c13565b038183305af1611852575b50611813578280f35b82600f81939261184a9683946001549061182f8260070b612126565b16906001600160401b03191617600155165af1610269612154565b818181808280f35b611865903d8087833e6105a08183611c84565b508661180a565b5034610274576080366003190112610274576001600160401b039181358381116102f45761189d9036908401611cc0565b6024358481116106b5576118b660209136908601611e4b565b916118bf611efd565b946118c8611f0c565b95611962575b6118eb85519485938493631758efa960e11b855230908501612245565b0381886108015af19182156102a657508491611944575b501561027457611910575080f35b600154906119208260070b612126565b16906001600160401b0319161760015561097f81808080600f335af1610269612154565b61195c915060203d811161029f576102918183611c84565b38611902565b6001546119718160070b612126565b8816906001600160401b0319161760015561199688808080600f335af1610269612154565b6118ce565b50903461027457826119ac36611d83565b9361055d8451958693849363b46a8d6160e01b85528401611feb565b50346102745760209081600319360112610755578035936001600160401b03918286116102f85781846119ff879836908501611cc0565b928751611a0b81611c38565b606099818b80935282858201520152611a3b885194859384936354212a8960e01b85528401526024830190611c13565b03816108015afa928315611b39578293611a9e575b505050610393918351948594828652611a8d611a76855184868a01526080890190611c13565b9385015193601f19948589830301848a0152611d07565b930151918584030190850152611d07565b909192503d8084843e611ab18184611c84565b8201918481840312610755578051908282116102f45701868184031261075557855193611add85611c38565b81518381116102f85784611af2918401612044565b8552858201518381116102f85784611b0b918401612289565b8686015286820151928311610505575091611b2c9161039395949301612289565b8482015290913880611a50565b85513d84823e3d90fd5b9150503461027457602036600319011261027457918061039393611b65611bbf565b6305431f4560e41b602083019081526001600160a01b03909116602480840191909152825290611b9481611c38565b51906108015afa90611bad611ba7612154565b92612389565b51918291602083526020830190611c13565b600435906001600160a01b0382168203611bd557565b600080fd5b602435906001600160a01b0382168203611bd557565b60005b838110611c035750506000910152565b8181015183820152602001611bf3565b90602091611c2c81518092818552858086019101611bf0565b601f01601f1916010190565b606081019081106001600160401b03821117611c5357604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117611c5357604052565b90601f801991011681019081106001600160401b03821117611c5357604052565b6001600160401b038111611c5357601f01601f191660200190565b81601f82011215611bd557803590611cd782611ca5565b92611ce56040519485611c84565b82845260208383010111611bd557816000926020809301838601378301015290565b908082519081815260208091019281808460051b8301019501936000915b848310611d355750505050505090565b9091929394958480600192601f19858203018652895190611d5e82516060808452830190611c13565b91838101518483015260ff604080920151169101529801930193019194939290611d25565b906040600319830112611bd5576004356001600160a01b0381168103611bd55791602435906001600160401b038211611bd557611dc291600401611cc0565b90565b908082519081815260208091019281808460051b8301019501936000915b848310611df35750505050505090565b9091929394958480600192601f198582030186528951908280611e1e84516040808652850190611c13565b9301519101529801930193019194939290611de3565b6001600160401b038111611c535760051b60200190565b81601f82011215611bd5578035611e6181611e34565b92604091611e7183519586611c84565b808552602093848087019260051b82010193838511611bd557858201925b858410611ea0575050505050505090565b6001600160401b03908435828111611bd55784019083601f198389030112611bd5578351611ecd81611c69565b89830135938411611bd5578483611eea8a8d809881980101611cc0565b8352013583820152815201930192611e8f565b604435908115158203611bd557565b606435908115158203611bd557565b602435908115158203611bd557565b35908115158203611bd557565b90815180825260208092019182818360051b82019501936000915b848310611f625750505050505090565b90919293949584808284600194038652895190611f8782516060808452830190611c13565b91838101518483015260ff604080920151169101529801930193019194939290611f52565b6024359063ffffffff82168203611bd557565b35906001600160401b0382168203611bd557565b90816020910312611bd557518015158103611bd55790565b6001600160a01b039091168152604060208201819052611dc292910190611c13565b9092919261201a81611ca5565b916120286040519384611c84565b829482845282820111611bd5576020612042930190611bf0565b565b9080601f83011215611bd5578151611dc29260200161200d565b906020908183820312611bd55782516001600160401b0393848211611bd557019080601f83011215611bd557815161209581611e34565b9460406120a481519788611c84565b828752858088019360051b86010194848611611bd557868101935b8685106120d157505050505050505090565b8451848111611bd557820183601f198289030112611bd5578351916120f583611c69565b8982015192868411611bd55785836121138b8e809881980101612044565b83520151838201528152019401936120bf565b60070b677fffffffffffffff811461213e5760010190565b634e487b7160e01b600052601160045260246000fd5b3d1561217f573d9061216582611ca5565b916121736040519384611c84565b82523d6000602084013e565b606090565b1561218b57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b6001600160a01b03909116815263ffffffff909116602082015260400190565b60070b60010190677fffffffffffffff8213677fffffffffffffff1983121761213e57565b60070b6000190190677fffffffffffffff198212677fffffffffffffff83131761213e57565b6001600160a01b039091168152606060208201819052611dc293919261226d91840190611c13565b916040818403910152611dc5565b519060ff82168203611bd557565b9080601f83011215611bd55781516122a081611e34565b926040916122b083519586611c84565b808552602093848087019260051b84010193818511611bd557858401925b8584106122df575050505050505090565b8351906001600160401b0391828111611bd55786019060609283601f198488030112611bd55784519061231182611c38565b8a840151908111611bd5578a948461233189886123419581990101612044565b845287810151868501520161227b565b858201528152019301926122ce565b90602082820312611bd55781516001600160401b038111611bd557611dc29201612289565b51906001600160401b0382168203611bd557565b1561239057565b60405162461bcd60e51b815260206004820152601f60248201527f6661696c65642073746174696343616c6c20746f20707265636f6d70696c65006044820152606490fdfea2646970667358221220c29b806ba0c5393e3d3328caa418ca6534f2dcf4f200fd01cb544b8d104e1e3564736f6c63430008140033", + "bytecode": "0x60806040523461027957604051602081016001600160401b038111828210176101c8576040819052606081016001600160401b038111828210176101c857604052602381527f2f636f736d6f732e7374616b696e672e763162657461312e4d736744656c656760208201526261746560e81b604082015281525f5460015f55806001106101dc575b505f8080525f80516020612590833981519152915b600182106100b3576040516122c490816102cc8239f35b80518051906001600160401b0382116101c8576100d0855461027d565b601f811161018d575b50602090601f83116001146101245792826001949360209386955f92610119575b50505f19600383901b1c191690841b1786555b0193019101909161009c565b015190505f806100fa565b90601f19831691865f52815f20925f5b818110610175575093602093600196938796938388951061015d575b505050811b01865561010d565b01515f1960f88460031b161c191690555f8080610150565b82840151855560019094019360209384019301610134565b6101b890865f5260205f20601f850160051c810191602086106101be575b601f0160051c01906102b5565b5f6100d9565b90915081906101ab565b634e487b7160e01b5f52604160045260245ffd5b5f80525f80516020612590833981519152017f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5645b81811061021d5750610087565b8061022a6001925461027d565b80610237575b5001610210565b601f8111831461024c57505f81555b5f610230565b61026890825f5283601f60205f20920160051c820191016102b5565b805f525f6020812081835555610246565b5f80fd5b90600182811c921680156102ab575b602083101461029757565b634e487b7160e01b5f52602260045260245ffd5b91607f169161028c565b8181106102c0575050565b5f81556001016102b556fe6080806040526004361015610012575f80fd5b5f3560e01c90816301b6800014611a8f575080630c05e9e4146119055780630da84768146118f3578063151732ec146117eb5780631b050207146116f9578063201139a2146116aa5780632947221b14611574578063296c60aa146114f8578063382d823c146114ac57806346e16d341461147d578063613d4de81461130e57806361bc221a146112ee5780636b7a547c146112585780636f669da41461123a57806378a5dfd11461120c578063796b96d2146111af5780637c9db0bb1461115957806388b2d58114610de057806393574cd114610d51578063963516e414610cc1578063ad5c4cdd14610c6a578063b2d1788314610b50578063b6a216ae146109ea578063be4efc5714610897578063cb85aa0a146107f1578063d0e30db0146107e4578063d3f831be1461073f578063dd987c20146106b3578063ddbfa271146105ac578063e0421e3914610506578063e236c7a6146102f15763f9ed9b671461017c575f80fd5b3461026757608036600319011261026757610195611b0b565b6024356001600160401b038111610267576101b4903690600401611d64565b9061020260206101c2611e1d565b926101cb611e2c565b936102a5575b60405180938192630b4ac1e760e21b835260018060a01b031696876004840152604060248401526044830190611ce1565b03815f6108015af190811561029a575f9161026b575b50156102675761022457005b5f808080600f6102659560015461023d8160070b61211b565b6001600160401b0316906001600160401b031916176001555af161025f611e7e565b50612147565b005b5f80fd5b61028d915060203d602011610293575b6102858183611ba5565b81019061219d565b5f610218565b503d61027b565b6040513d5f823e3d90fd5b6001546102b48160070b61211b565b6001600160401b031667ffffffffffffffff1991909116176001556102ec5f808080600f6001600160a01b0387165af161025f611e7e565b6101d1565b346102675760203660031901126102675761030a611b0b565b604051630a97c34560e31b81526001600160a01b0390911660048201525f816024816108015afa90811561029a575f905f926103dc575b5090604051809260408201926040835281518094526060830193602060608260051b8601019301945f905b82821061038b57858061038787878382036020850152611c27565b0390f35b919360019193955060206103ca8192605f198b8203018652895190836103ba8351604084526040840190611b37565b9201519084818403910152611c27565b9701920192018694929593919561036c565b9150503d805f833e6103ee8183611ba5565b8101906040818303126102675780516001600160401b0381116102675781019180601f840112156102675782519261042584611d4d565b936104336040519586611ba5565b80855260208086019160051b830101918383116102675760208101915b83831061047f575050505060208201516001600160401b038111610267576104789201611f57565b9082610341565b82516001600160401b038111610267578201906040828703601f19011261026757604051906104ad82611b8a565b60208301516001600160401b038111610267578760206104cf92860101611f2f565b82526040830151916001600160401b038311610267576104f788602080969581960101611f57565b83820152815201920191610450565b34610267576020366003190112610267576004356001600160401b038111610267575f61053a61055c923690600401611be1565b60405180938192631e7271df60e11b8352602060048401526024830190611b37565b0381836108015af1801561029a57610387915f9161058a575b50604051918291602083526020830190611ce1565b6105a691503d805f833e61059e8183611ba5565b810190612024565b82610575565b34610267576060366003190112610267576105c5611b0b565b6024356001600160401b038111610267576105e4903690600401611be1565b604435906001600160401b038211610267576106066020923690600401611d64565b926001546106168160070b612210565b6001600160401b0316906001600160401b0319161760015561064c6040519485938493631758efa960e11b8552600485016121b5565b03815f6108015af1801561029a576020915f91610696575b506001546106748160070b612235565b6001600160401b0316906001600160401b031916176001556040519015158152f35b6106ad9150823d8411610293576102858183611ba5565b82610664565b6040366003190112610267576004356001600160401b0381116102675760206106e361070b923690600401611be1565b604051809381926353266bbb60e01b8352306004840152606060248401526064830190611b37565b602435604483015203815f6108005af1801561029a5761072757005b6102659060203d602011610293576102858183611ba5565b34610267576020366003190112610267576004356001600160401b038111610267575f610773610795923690600401611be1565b604051809381926342d9696d60e11b8352602060048401526024830190611b37565b03816108015afa801561029a57610387915f916107c2575b50604051918291602083526020830190611c27565b6107de91503d805f833e6107d68183611ba5565b8101906121eb565b826107ad565b5f36600319011261026757005b346102675760203660031901126102675761080a611b0b565b6040516305431f4560e41b81526001600160a01b0390911660048201525f816024816108015afa801561029a575f90610856575b61038790604051918291602083526020830190611b37565b503d805f833e6108668183611ba5565b810190602081830312610267578051916001600160401b03831161026757610387926108929201611f2f565b61083e565b346102675760603660031901126102675760043563ffffffff81168103610267576108ef60206108c5611e3b565b926108ce611e1d565b936109aa575b60405180938192632efe8a5f60e01b8352306004840161225a565b03815f6108015af190811561029a575f9161098b575b501561094c5761091157005b6001546109208160070b61211b565b6001600160401b0316906001600160401b031916176001556102655f808080600f335af161025f611e7e565b60405162461bcd60e51b81526020600482015260176024820152766661696c656420746f20636c61696d207265776172647360481b6044820152606490fd5b6109a4915060203d602011610293576102858183611ba5565b82610905565b6001546109b98160070b61211b565b6001600160401b0316906001600160401b031916176001556109e55f808080600f335af161025f611e7e565b6108d4565b3461026757602036600319011261026757610a03611b0b565b60405163a66cb60560e01b81526001600160a01b0390911660048201525f816024816108015afa90811561029a575f91610a9f575b506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b828210610a7057505050500390f35b91936001919395506020610a8f8192603f198a82030186528851611b37565b9601920192018594939192610a61565b90503d805f833e610ab08183611ba5565b810190602081830312610267578051906001600160401b03821161026757019080601f83011215610267578151610ae681611d4d565b92610af46040519485611ba5565b81845260208085019260051b820101918383116102675760208201905b838210610b2357505050505081610a38565b81516001600160401b03811161026757602091610b4587848094880101611f2f565b815201910190610b11565b34610267576060366003190112610267576004356001600160401b03811161026757610b80903690600401611be1565b610b88611b21565b6044356001600160401b038111610267576020610bac610bc8923690600401611be1565b9360405180938192632d4ecd4b60e11b835233600484016120f9565b03815f6108015af190811561029a575f91610c4b575b5015610c065760405163b46a8d6160e01b8152915f918391829161055c9190600484016120f9565b60405162461bcd60e51b815260206004820152601e60248201527f6661696c656420746f20736574207769746864726177206164647265737300006044820152606490fd5b610c64915060203d602011610293576102858183611ba5565b83610bde565b3461026757610c985f610c7c36611c9f565b60405163b46a8d6160e01b8152938492839290600484016120f9565b0381836108015af1801561029a57610cae575f80fd5b610267903d805f833e61059e8183611ba5565b34610267576020366003190112610267576004356001600160401b038111610267576020610cf6610d11923690600401611be1565b60405180938192632d4ecd4b60e11b835230600484016120f9565b03815f6108015af1801561029a576020915f91610d34575b506040519015158152f35b610d4b9150823d8411610293576102858183611ba5565b82610d29565b3461026757604036600319011261026757610d936020610d6f611b0b565b610d77611e57565b604051632efe8a5f60e01b81529384928392906004840161225a565b03815f6108015af15f9181610dbf575b50610db7575060205f5b6040519015158152f35b602090610dad565b610dd991925060203d602011610293576102858183611ba5565b9082610da3565b34610267576080366003190112610267576004356001600160401b03811161026757610e10903690600401611be1565b6024356001600160401b038116809103610267576044356001600160401b03811680910361026757606435906001600160401b038211610267578136039060a0600319830112610267575f6020604051610e6981611b8a565b60608152015260405163479239e760e11b81526080600482015294610e92906084870190611b37565b936024860152604485015260031984840301606485015281600401359060221901811215610267578101906024600483013592016001600160401b038311610267578236038113610267578383610f4e608460c0958997889660a05f9b528160a088015288870137888785870101526001600160401b03610f1560248301611e6a565b1660208601526001600160401b03610f2f60448301611e6a565b166040860152610f4160648201611e4a565b1515606086015201611e4a565b15156080830152601f01601f1916010301816108015afa801561029a575f915f91611007575b506040519060408201926040835280518094526020606084019101935f5b818110610fcf575050828094508103602084015260206001600160401b0381610fc48551604086526040860190611b37565b940151169101520390f35b855180516001600160401b0316845260209081015180518286015281015160ff16604085015290950194606090920191600101610f92565b9150503d805f833e6110198183611ba5565b8101906040818303126102675780516001600160401b0381116102675781019082601f8301121561026757815161104f81611d4d565b9261105d6040519485611ba5565b8184526020606081860193028201019085821161026757602001915b8183106110f5575050506020810151906001600160401b038211610267570160408184031261026757604051926110af84611b8a565b81516001600160401b0381116102675782019181601f84011215610267576110e160209284846110e996519101611ef9565b85520161227a565b60208301529082610f74565b8286036060811261026757604080519161110e83611b8a565b6111178661227a565b8352601f1901126102675760609160209160405161113481611b8a565b83870151815261114660408801611f49565b8482015283820152815201920191611079565b34610267576020366003190112610267576004356001600160401b038111610267575f61118d610795923690600401611be1565b604051809381926307ba81ef60e31b8352602060048401526024830190611b37565b34610267576102655f806111f76111e96111c836611c9f565b6040939193519283916020830195632d4ecd4b60e11b8752602484016120f9565b03601f198101835282611ba5565b51906108015afa611206611e7e565b50611ead565b34610267576107955f61121e36611c9f565b6040516326b558ed60e21b8152938492839290600484016120f9565b3461026757604036600319011261026757610d116020610d6f611b0b565b3461026757604036600319011261026757611271611b0b565b6024356001600160401b0381116102675761064c916112966020923690600401611d64565b906001546112a68160070b612210565b6001600160401b0316906001600160401b031916176001556040519384928392630b4ac1e760e21b845260018060a01b03166004840152604060248401526044830190611ce1565b34610267575f36600319011261026757602060015460070b604051908152f35b34610267576080366003190112610267576004356001600160401b03811161026757611341611383913690600401611be1565b611349611b21565b5f611352611e1d565b9261135b611e2c565b93611421575b60405180958192631e7271df60e11b8352602060048401526024830190611b37565b0381836108015af191821561029a57610387935f93611405575b506113b75750604051918291602083526020830190611ce1565b6001546113c68160070b61211b565b6001600160401b031667ffffffffffffffff1991909116176001556001600160a01b0316308114610575575f808080600f6105a6955af161025f611e7e565b61141a9193503d805f833e61059e8183611ba5565b918461139d565b6001546114308160070b61211b565b6001600160401b031667ffffffffffffffff1991909116176001556001600160a01b038316308103611463575b50611361565b82808080600f611477955af161025f611e7e565b8561145d565b3461026757610d11602061149036611c9f565b604051632d4ecd4b60e11b8152938492839290600484016120f9565b34610267575f3660031901126102675760405163014d140b60e41b81525f816004816108015afa801561029a57610387915f916107c25750604051918291602083526020830190611c27565b34610267575f8061150e6111e96111c836611c9f565b51906108015af461151d611e7e565b501561152557005b60405162461bcd60e51b815260206004820152602160248201527f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c6044820152606560f81b6064820152608490fd5b34610267576060366003190112610267576004356001600160401b038111610267576115a76115da913690600401611be1565b5f6115b0611e3b565b916115b9611e1d565b9261166a575b6040518094819263b46a8d6160e01b835230600484016120f9565b0381836108015af190811561029a57610387925f9261164e575b5061160e575b604051918291602083526020830190611ce1565b60015461161d8160070b61211b565b6001600160401b0316906001600160401b031916176001556116495f808080600f335af161025f611e7e565b6115fa565b6116639192503d805f833e61059e8183611ba5565b90836115f4565b6001546116798160070b61211b565b6001600160401b0316906001600160401b031916176001556116a582808080600f335af161025f611e7e565b6115bf565b34610267576020366003190112610267576004356001600160401b038111610267575f6116de61055c923690600401611be1565b6040518093819263b46a8d6160e01b835230600484016120f9565b3461026757608036600319011261026757611712611b0b565b61171a611b21565b906044356001600160401b038111610267575f61173e61177a923690600401611be1565b611746611e2c565b6040805163ad5c4cdd60e01b81526001600160a01b0390961660048701526024860152939283918291906044830190611b37565b038183305af16117d3575b5061178c57005b5f808080600f610265956001546117a58160070b61211b565b6001600160401b031667ffffffffffffffff1991909116176001556001600160a01b03165af161025f611e7e565b6117e6903d805f833e61059e8183611ba5565b611785565b34610267576080366003190112610267576004356001600160401b0381116102675761181b903690600401611be1565b6024356001600160401b03811161026757602061183f611872923690600401611d64565b611847611e1d565b93611850611e2c565b946118b3575b604051631758efa960e11b8152938492839230600485016121b5565b03815f6108015af190811561029a575f91611894575b50156102675761091157005b6118ad915060203d602011610293576102858183611ba5565b82611888565b6001546118c28160070b61211b565b6001600160401b0316906001600160401b031916176001556118ee5f808080600f335af161025f611e7e565b611856565b346102675761055c5f610c7c36611c9f565b34610267576020366003190112610267576004356001600160401b038111610267575f611939611975923690600401611be1565b60606040805161194881611b5b565b8281528260208201520152604051809381926354212a8960e01b8352602060048401526024830190611b37565b03816108015afa801561029a575f906119db575b610387906040519182916020835260406119c76119b28351606060208801526080870190611b37565b6020840151868203601f190184880152611c27565b910151838203601f19016060850152611c27565b503d805f833e6119eb8183611ba5565b810190602081830312610267578051906001600160401b03821161026757016060818303126102675760405190611a2182611b5b565b80516001600160401b0381116102675783611a3d918301611f2f565b825260208101516001600160401b0381116102675783611a5e918301611f57565b60208301526040810151926001600160401b0384116102675761038793611a859201611f57565b6040820152611989565b34610267576020366003190112610267575f8061038792611aae611b0b565b6305431f4560e41b602083019081526001600160a01b03909116602480840191909152825290611adf604482611ba5565b51906108015afa611af7611af1611e7e565b91611ead565b604051918291602083526020830190611b37565b600435906001600160a01b038216820361026757565b602435906001600160a01b038216820361026757565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b606081019081106001600160401b03821117611b7657604052565b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b03821117611b7657604052565b90601f801991011681019081106001600160401b03821117611b7657604052565b6001600160401b038111611b7657601f01601f191660200190565b81601f8201121561026757803590611bf882611bc6565b92611c066040519485611ba5565b8284526020838301011161026757815f926020809301838601378301015290565b9080602083519182815201916020808360051b8301019401925f915b838310611c5257505050505090565b9091929394602080600192601f19858203018652885190604060ff81611c818551606086526060860190611b37565b94868101518786015201511691015297019301930191939290611c43565b906040600319830112610267576004356001600160a01b03811681036102675791602435906001600160401b03821161026757611cde91600401611be1565b90565b9080602083519182815201916020808360051b8301019401925f915b838310611d0c57505050505090565b9091929394602080600192601f198582030186528851908280611d388451604085526040850190611b37565b93015191015297019301930191939290611cfd565b6001600160401b038111611b765760051b60200190565b81601f8201121561026757803590611d7b82611d4d565b92611d896040519485611ba5565b82845260208085019360051b830101918183116102675760208101935b838510611db557505050505090565b84356001600160401b0381116102675782016040818503601f1901126102675760405191611de283611b8a565b6020820135926001600160401b03841161026757604083611e0a886020809881980101611be1565b8352013583820152815201940193611da6565b60443590811515820361026757565b60643590811515820361026757565b60243590811515820361026757565b3590811515820361026757565b6024359063ffffffff8216820361026757565b35906001600160401b038216820361026757565b3d15611ea8573d90611e8f82611bc6565b91611e9d6040519384611ba5565b82523d5f602084013e565b606090565b15611eb457565b60405162461bcd60e51b815260206004820152601f60248201527f6661696c65642073746174696343616c6c20746f20707265636f6d70696c65006044820152606490fd5b929192611f0582611bc6565b91611f136040519384611ba5565b829481845281830111610267578281602093845f96015e010152565b9080601f83011215610267578151611cde92602001611ef9565b519060ff8216820361026757565b9080601f8301121561026757815191611f6f83611d4d565b92611f7d6040519485611ba5565b80845260208085019160051b830101918383116102675760208101915b838310611fa957505050505090565b82516001600160401b038111610267578201906060828703601f1901126102675760405190611fd782611b5b565b6020830151916001600160401b038311610267576120146060856120038b602080999881990101611f2f565b845260408101518685015201611f49565b6040820152815201920191611f9a565b602081830312610267578051906001600160401b038211610267570181601f820112156102675780519061205782611d4d565b926120656040519485611ba5565b82845260208085019360051b830101918183116102675760208101935b83851061209157505050505090565b84516001600160401b0381116102675782016040818503601f19011261026757604051916120be83611b8a565b6020820151926001600160401b038411610267576040836120e6886020809881980101611f2f565b8352015183820152815201940193612082565b6001600160a01b039091168152604060208201819052611cde92910190611b37565b60070b677fffffffffffffff81146121335760010190565b634e487b7160e01b5f52601160045260245ffd5b1561214e57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b90816020910312610267575180151581036102675790565b6001600160a01b039091168152606060208201819052611cde9391926121dd91840190611b37565b916040818403910152611ce1565b906020828203126102675781516001600160401b03811161026757611cde9201611f57565b60070b60010190677fffffffffffffff8213677fffffffffffffff1983121761213357565b60070b5f190190677fffffffffffffff198212677fffffffffffffff83131761213357565b6001600160a01b03909116815263ffffffff909116602082015260400190565b51906001600160401b03821682036102675756fea2646970667358221220a7305466e321370c5c5117fb29d672ac5be9c18d2feb2667c0e7928d1a35d2c464736f6c634300081a0033290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c90816301b6800014611a8f575080630c05e9e4146119055780630da84768146118f3578063151732ec146117eb5780631b050207146116f9578063201139a2146116aa5780632947221b14611574578063296c60aa146114f8578063382d823c146114ac57806346e16d341461147d578063613d4de81461130e57806361bc221a146112ee5780636b7a547c146112585780636f669da41461123a57806378a5dfd11461120c578063796b96d2146111af5780637c9db0bb1461115957806388b2d58114610de057806393574cd114610d51578063963516e414610cc1578063ad5c4cdd14610c6a578063b2d1788314610b50578063b6a216ae146109ea578063be4efc5714610897578063cb85aa0a146107f1578063d0e30db0146107e4578063d3f831be1461073f578063dd987c20146106b3578063ddbfa271146105ac578063e0421e3914610506578063e236c7a6146102f15763f9ed9b671461017c575f80fd5b3461026757608036600319011261026757610195611b0b565b6024356001600160401b038111610267576101b4903690600401611d64565b9061020260206101c2611e1d565b926101cb611e2c565b936102a5575b60405180938192630b4ac1e760e21b835260018060a01b031696876004840152604060248401526044830190611ce1565b03815f6108015af190811561029a575f9161026b575b50156102675761022457005b5f808080600f6102659560015461023d8160070b61211b565b6001600160401b0316906001600160401b031916176001555af161025f611e7e565b50612147565b005b5f80fd5b61028d915060203d602011610293575b6102858183611ba5565b81019061219d565b5f610218565b503d61027b565b6040513d5f823e3d90fd5b6001546102b48160070b61211b565b6001600160401b031667ffffffffffffffff1991909116176001556102ec5f808080600f6001600160a01b0387165af161025f611e7e565b6101d1565b346102675760203660031901126102675761030a611b0b565b604051630a97c34560e31b81526001600160a01b0390911660048201525f816024816108015afa90811561029a575f905f926103dc575b5090604051809260408201926040835281518094526060830193602060608260051b8601019301945f905b82821061038b57858061038787878382036020850152611c27565b0390f35b919360019193955060206103ca8192605f198b8203018652895190836103ba8351604084526040840190611b37565b9201519084818403910152611c27565b9701920192018694929593919561036c565b9150503d805f833e6103ee8183611ba5565b8101906040818303126102675780516001600160401b0381116102675781019180601f840112156102675782519261042584611d4d565b936104336040519586611ba5565b80855260208086019160051b830101918383116102675760208101915b83831061047f575050505060208201516001600160401b038111610267576104789201611f57565b9082610341565b82516001600160401b038111610267578201906040828703601f19011261026757604051906104ad82611b8a565b60208301516001600160401b038111610267578760206104cf92860101611f2f565b82526040830151916001600160401b038311610267576104f788602080969581960101611f57565b83820152815201920191610450565b34610267576020366003190112610267576004356001600160401b038111610267575f61053a61055c923690600401611be1565b60405180938192631e7271df60e11b8352602060048401526024830190611b37565b0381836108015af1801561029a57610387915f9161058a575b50604051918291602083526020830190611ce1565b6105a691503d805f833e61059e8183611ba5565b810190612024565b82610575565b34610267576060366003190112610267576105c5611b0b565b6024356001600160401b038111610267576105e4903690600401611be1565b604435906001600160401b038211610267576106066020923690600401611d64565b926001546106168160070b612210565b6001600160401b0316906001600160401b0319161760015561064c6040519485938493631758efa960e11b8552600485016121b5565b03815f6108015af1801561029a576020915f91610696575b506001546106748160070b612235565b6001600160401b0316906001600160401b031916176001556040519015158152f35b6106ad9150823d8411610293576102858183611ba5565b82610664565b6040366003190112610267576004356001600160401b0381116102675760206106e361070b923690600401611be1565b604051809381926353266bbb60e01b8352306004840152606060248401526064830190611b37565b602435604483015203815f6108005af1801561029a5761072757005b6102659060203d602011610293576102858183611ba5565b34610267576020366003190112610267576004356001600160401b038111610267575f610773610795923690600401611be1565b604051809381926342d9696d60e11b8352602060048401526024830190611b37565b03816108015afa801561029a57610387915f916107c2575b50604051918291602083526020830190611c27565b6107de91503d805f833e6107d68183611ba5565b8101906121eb565b826107ad565b5f36600319011261026757005b346102675760203660031901126102675761080a611b0b565b6040516305431f4560e41b81526001600160a01b0390911660048201525f816024816108015afa801561029a575f90610856575b61038790604051918291602083526020830190611b37565b503d805f833e6108668183611ba5565b810190602081830312610267578051916001600160401b03831161026757610387926108929201611f2f565b61083e565b346102675760603660031901126102675760043563ffffffff81168103610267576108ef60206108c5611e3b565b926108ce611e1d565b936109aa575b60405180938192632efe8a5f60e01b8352306004840161225a565b03815f6108015af190811561029a575f9161098b575b501561094c5761091157005b6001546109208160070b61211b565b6001600160401b0316906001600160401b031916176001556102655f808080600f335af161025f611e7e565b60405162461bcd60e51b81526020600482015260176024820152766661696c656420746f20636c61696d207265776172647360481b6044820152606490fd5b6109a4915060203d602011610293576102858183611ba5565b82610905565b6001546109b98160070b61211b565b6001600160401b0316906001600160401b031916176001556109e55f808080600f335af161025f611e7e565b6108d4565b3461026757602036600319011261026757610a03611b0b565b60405163a66cb60560e01b81526001600160a01b0390911660048201525f816024816108015afa90811561029a575f91610a9f575b506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b828210610a7057505050500390f35b91936001919395506020610a8f8192603f198a82030186528851611b37565b9601920192018594939192610a61565b90503d805f833e610ab08183611ba5565b810190602081830312610267578051906001600160401b03821161026757019080601f83011215610267578151610ae681611d4d565b92610af46040519485611ba5565b81845260208085019260051b820101918383116102675760208201905b838210610b2357505050505081610a38565b81516001600160401b03811161026757602091610b4587848094880101611f2f565b815201910190610b11565b34610267576060366003190112610267576004356001600160401b03811161026757610b80903690600401611be1565b610b88611b21565b6044356001600160401b038111610267576020610bac610bc8923690600401611be1565b9360405180938192632d4ecd4b60e11b835233600484016120f9565b03815f6108015af190811561029a575f91610c4b575b5015610c065760405163b46a8d6160e01b8152915f918391829161055c9190600484016120f9565b60405162461bcd60e51b815260206004820152601e60248201527f6661696c656420746f20736574207769746864726177206164647265737300006044820152606490fd5b610c64915060203d602011610293576102858183611ba5565b83610bde565b3461026757610c985f610c7c36611c9f565b60405163b46a8d6160e01b8152938492839290600484016120f9565b0381836108015af1801561029a57610cae575f80fd5b610267903d805f833e61059e8183611ba5565b34610267576020366003190112610267576004356001600160401b038111610267576020610cf6610d11923690600401611be1565b60405180938192632d4ecd4b60e11b835230600484016120f9565b03815f6108015af1801561029a576020915f91610d34575b506040519015158152f35b610d4b9150823d8411610293576102858183611ba5565b82610d29565b3461026757604036600319011261026757610d936020610d6f611b0b565b610d77611e57565b604051632efe8a5f60e01b81529384928392906004840161225a565b03815f6108015af15f9181610dbf575b50610db7575060205f5b6040519015158152f35b602090610dad565b610dd991925060203d602011610293576102858183611ba5565b9082610da3565b34610267576080366003190112610267576004356001600160401b03811161026757610e10903690600401611be1565b6024356001600160401b038116809103610267576044356001600160401b03811680910361026757606435906001600160401b038211610267578136039060a0600319830112610267575f6020604051610e6981611b8a565b60608152015260405163479239e760e11b81526080600482015294610e92906084870190611b37565b936024860152604485015260031984840301606485015281600401359060221901811215610267578101906024600483013592016001600160401b038311610267578236038113610267578383610f4e608460c0958997889660a05f9b528160a088015288870137888785870101526001600160401b03610f1560248301611e6a565b1660208601526001600160401b03610f2f60448301611e6a565b166040860152610f4160648201611e4a565b1515606086015201611e4a565b15156080830152601f01601f1916010301816108015afa801561029a575f915f91611007575b506040519060408201926040835280518094526020606084019101935f5b818110610fcf575050828094508103602084015260206001600160401b0381610fc48551604086526040860190611b37565b940151169101520390f35b855180516001600160401b0316845260209081015180518286015281015160ff16604085015290950194606090920191600101610f92565b9150503d805f833e6110198183611ba5565b8101906040818303126102675780516001600160401b0381116102675781019082601f8301121561026757815161104f81611d4d565b9261105d6040519485611ba5565b8184526020606081860193028201019085821161026757602001915b8183106110f5575050506020810151906001600160401b038211610267570160408184031261026757604051926110af84611b8a565b81516001600160401b0381116102675782019181601f84011215610267576110e160209284846110e996519101611ef9565b85520161227a565b60208301529082610f74565b8286036060811261026757604080519161110e83611b8a565b6111178661227a565b8352601f1901126102675760609160209160405161113481611b8a565b83870151815261114660408801611f49565b8482015283820152815201920191611079565b34610267576020366003190112610267576004356001600160401b038111610267575f61118d610795923690600401611be1565b604051809381926307ba81ef60e31b8352602060048401526024830190611b37565b34610267576102655f806111f76111e96111c836611c9f565b6040939193519283916020830195632d4ecd4b60e11b8752602484016120f9565b03601f198101835282611ba5565b51906108015afa611206611e7e565b50611ead565b34610267576107955f61121e36611c9f565b6040516326b558ed60e21b8152938492839290600484016120f9565b3461026757604036600319011261026757610d116020610d6f611b0b565b3461026757604036600319011261026757611271611b0b565b6024356001600160401b0381116102675761064c916112966020923690600401611d64565b906001546112a68160070b612210565b6001600160401b0316906001600160401b031916176001556040519384928392630b4ac1e760e21b845260018060a01b03166004840152604060248401526044830190611ce1565b34610267575f36600319011261026757602060015460070b604051908152f35b34610267576080366003190112610267576004356001600160401b03811161026757611341611383913690600401611be1565b611349611b21565b5f611352611e1d565b9261135b611e2c565b93611421575b60405180958192631e7271df60e11b8352602060048401526024830190611b37565b0381836108015af191821561029a57610387935f93611405575b506113b75750604051918291602083526020830190611ce1565b6001546113c68160070b61211b565b6001600160401b031667ffffffffffffffff1991909116176001556001600160a01b0316308114610575575f808080600f6105a6955af161025f611e7e565b61141a9193503d805f833e61059e8183611ba5565b918461139d565b6001546114308160070b61211b565b6001600160401b031667ffffffffffffffff1991909116176001556001600160a01b038316308103611463575b50611361565b82808080600f611477955af161025f611e7e565b8561145d565b3461026757610d11602061149036611c9f565b604051632d4ecd4b60e11b8152938492839290600484016120f9565b34610267575f3660031901126102675760405163014d140b60e41b81525f816004816108015afa801561029a57610387915f916107c25750604051918291602083526020830190611c27565b34610267575f8061150e6111e96111c836611c9f565b51906108015af461151d611e7e565b501561152557005b60405162461bcd60e51b815260206004820152602160248201527f6661696c65642064656c656761746543616c6c20746f20707265636f6d70696c6044820152606560f81b6064820152608490fd5b34610267576060366003190112610267576004356001600160401b038111610267576115a76115da913690600401611be1565b5f6115b0611e3b565b916115b9611e1d565b9261166a575b6040518094819263b46a8d6160e01b835230600484016120f9565b0381836108015af190811561029a57610387925f9261164e575b5061160e575b604051918291602083526020830190611ce1565b60015461161d8160070b61211b565b6001600160401b0316906001600160401b031916176001556116495f808080600f335af161025f611e7e565b6115fa565b6116639192503d805f833e61059e8183611ba5565b90836115f4565b6001546116798160070b61211b565b6001600160401b0316906001600160401b031916176001556116a582808080600f335af161025f611e7e565b6115bf565b34610267576020366003190112610267576004356001600160401b038111610267575f6116de61055c923690600401611be1565b6040518093819263b46a8d6160e01b835230600484016120f9565b3461026757608036600319011261026757611712611b0b565b61171a611b21565b906044356001600160401b038111610267575f61173e61177a923690600401611be1565b611746611e2c565b6040805163ad5c4cdd60e01b81526001600160a01b0390961660048701526024860152939283918291906044830190611b37565b038183305af16117d3575b5061178c57005b5f808080600f610265956001546117a58160070b61211b565b6001600160401b031667ffffffffffffffff1991909116176001556001600160a01b03165af161025f611e7e565b6117e6903d805f833e61059e8183611ba5565b611785565b34610267576080366003190112610267576004356001600160401b0381116102675761181b903690600401611be1565b6024356001600160401b03811161026757602061183f611872923690600401611d64565b611847611e1d565b93611850611e2c565b946118b3575b604051631758efa960e11b8152938492839230600485016121b5565b03815f6108015af190811561029a575f91611894575b50156102675761091157005b6118ad915060203d602011610293576102858183611ba5565b82611888565b6001546118c28160070b61211b565b6001600160401b0316906001600160401b031916176001556118ee5f808080600f335af161025f611e7e565b611856565b346102675761055c5f610c7c36611c9f565b34610267576020366003190112610267576004356001600160401b038111610267575f611939611975923690600401611be1565b60606040805161194881611b5b565b8281528260208201520152604051809381926354212a8960e01b8352602060048401526024830190611b37565b03816108015afa801561029a575f906119db575b610387906040519182916020835260406119c76119b28351606060208801526080870190611b37565b6020840151868203601f190184880152611c27565b910151838203601f19016060850152611c27565b503d805f833e6119eb8183611ba5565b810190602081830312610267578051906001600160401b03821161026757016060818303126102675760405190611a2182611b5b565b80516001600160401b0381116102675783611a3d918301611f2f565b825260208101516001600160401b0381116102675783611a5e918301611f57565b60208301526040810151926001600160401b0384116102675761038793611a859201611f57565b6040820152611989565b34610267576020366003190112610267575f8061038792611aae611b0b565b6305431f4560e41b602083019081526001600160a01b03909116602480840191909152825290611adf604482611ba5565b51906108015afa611af7611af1611e7e565b91611ead565b604051918291602083526020830190611b37565b600435906001600160a01b038216820361026757565b602435906001600160a01b038216820361026757565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b606081019081106001600160401b03821117611b7657604052565b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b03821117611b7657604052565b90601f801991011681019081106001600160401b03821117611b7657604052565b6001600160401b038111611b7657601f01601f191660200190565b81601f8201121561026757803590611bf882611bc6565b92611c066040519485611ba5565b8284526020838301011161026757815f926020809301838601378301015290565b9080602083519182815201916020808360051b8301019401925f915b838310611c5257505050505090565b9091929394602080600192601f19858203018652885190604060ff81611c818551606086526060860190611b37565b94868101518786015201511691015297019301930191939290611c43565b906040600319830112610267576004356001600160a01b03811681036102675791602435906001600160401b03821161026757611cde91600401611be1565b90565b9080602083519182815201916020808360051b8301019401925f915b838310611d0c57505050505090565b9091929394602080600192601f198582030186528851908280611d388451604085526040850190611b37565b93015191015297019301930191939290611cfd565b6001600160401b038111611b765760051b60200190565b81601f8201121561026757803590611d7b82611d4d565b92611d896040519485611ba5565b82845260208085019360051b830101918183116102675760208101935b838510611db557505050505090565b84356001600160401b0381116102675782016040818503601f1901126102675760405191611de283611b8a565b6020820135926001600160401b03841161026757604083611e0a886020809881980101611be1565b8352013583820152815201940193611da6565b60443590811515820361026757565b60643590811515820361026757565b60243590811515820361026757565b3590811515820361026757565b6024359063ffffffff8216820361026757565b35906001600160401b038216820361026757565b3d15611ea8573d90611e8f82611bc6565b91611e9d6040519384611ba5565b82523d5f602084013e565b606090565b15611eb457565b60405162461bcd60e51b815260206004820152601f60248201527f6661696c65642073746174696343616c6c20746f20707265636f6d70696c65006044820152606490fd5b929192611f0582611bc6565b91611f136040519384611ba5565b829481845281830111610267578281602093845f96015e010152565b9080601f83011215610267578151611cde92602001611ef9565b519060ff8216820361026757565b9080601f8301121561026757815191611f6f83611d4d565b92611f7d6040519485611ba5565b80845260208085019160051b830101918383116102675760208101915b838310611fa957505050505090565b82516001600160401b038111610267578201906060828703601f1901126102675760405190611fd782611b5b565b6020830151916001600160401b038311610267576120146060856120038b602080999881990101611f2f565b845260408101518685015201611f49565b6040820152815201920191611f9a565b602081830312610267578051906001600160401b038211610267570181601f820112156102675780519061205782611d4d565b926120656040519485611ba5565b82845260208085019360051b830101918183116102675760208101935b83851061209157505050505090565b84516001600160401b0381116102675782016040818503601f19011261026757604051916120be83611b8a565b6020820151926001600160401b038411610267576040836120e6886020809881980101611f2f565b8352015183820152815201940193612082565b6001600160a01b039091168152604060208201819052611cde92910190611b37565b60070b677fffffffffffffff81146121335760010190565b634e487b7160e01b5f52601160045260245ffd5b1561214e57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b90816020910312610267575180151581036102675790565b6001600160a01b039091168152606060208201819052611cde9391926121dd91840190611b37565b916040818403910152611ce1565b906020828203126102675781516001600160401b03811161026757611cde9201611f57565b60070b60010190677fffffffffffffff8213677fffffffffffffff1983121761213357565b60070b5f190190677fffffffffffffff198212677fffffffffffffff83131761213357565b6001600160a01b03909116815263ffffffff909116602082015260400190565b51906001600160401b03821682036102675756fea2646970667358221220a7305466e321370c5c5117fb29d672ac5be9c18d2feb2667c0e7928d1a35d2c464736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/testutil/contracts/DistributionCaller.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/testutil/contracts/FlashLoan.json b/precompiles/testutil/contracts/FlashLoan.json index eae5db6db..63a01e403 100644 --- a/precompiles/testutil/contracts/FlashLoan.json +++ b/precompiles/testutil/contracts/FlashLoan.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "FlashLoan", "sourceName": "solidity/precompiles/testutil/contracts/FlashLoan.sol", "abi": [ @@ -93,8 +93,11 @@ "type": "function" } ], - "bytecode": "0x6080806040523461002857600080546001600160a01b03191633179055610a4f908161002e8239f35b600080fdfe6080604081815260048036101561001557600080fd5b600092833560e01c9081638da5cb5b1461070e575080638f518430146106605780639b4f21a9146104195763b86219241461004f57600080fd5b610058366107c6565b84549094916001600160a01b03916100739083163314610809565b8451636eb1769f60e11b815233858201908152306020828101919091529793909216918790829081906040010381855afa801561040f5784906103e0575b6100be915034111561085f565b8451926370a0823160e01b92838552308686015260249488818781875afa9081156102f25783916103af575b5087516323b872dd60e01b8152338882019081523060208201523460408201528a9082908190606001038187895af19081156103885790610132918591610392575b506108bc565b875190858252308883015289828881885afa91821561038857908a92918592610352575b5061018b939161016a610170923490610919565b1461093c565b8851809381926353266bbb60e01b83523490308c850161097c565b0381856108005af190811561032b57906101ac918391610335575b506109d8565b855192808452308685015287848681865afa93841561032b5782946102fc575b50865163a9059cbb60e01b815233878201523486820152888160448186885af180156102f257908992916102c5575b50858851809581938252308a8301525afa9182156102b9578192610286575b503483039283116102745750036102345750505160018152f35b606493601b9293519362461bcd60e51b85528401528201527f466c617368206c6f616e2072657061796d656e74206661696c656400000000006044820152fd5b634e487b7160e01b8152601185528390fd5b9091508681813d83116102b2575b61029e8183610732565b810103126102ae5751903861021a565b5080fd5b503d610294565b508551903d90823e3d90fd5b6102e490833d85116102eb575b6102dc8183610732565b8101906108a4565b50386101fb565b503d6102d2565b88513d85823e3d90fd5b9093508781813d8311610324575b6103148183610732565b810103126102ae575192386101cc565b503d61030a565b87513d84823e3d90fd5b61034c9150893d8b116102eb576102dc8183610732565b386101a6565b8092508391933d8311610381575b61036a8183610732565b8101031261037d57518991610170610156565b8380fd5b503d610360565b89513d86823e3d90fd5b6103a991508b3d8d116102eb576102dc8183610732565b3861012c565b90508881813d83116103d9575b6103c68183610732565b810103126103d55751386100ea565b8280fd5b503d6103bc565b508681813d8311610408575b6103f68183610732565b8101031261037d576100be90516100b1565b503d6103ec565b86513d86823e3d90fd5b5091610424366107c6565b82549094916001600160a01b039161043f9083163314610809565b8451636eb1769f60e11b815233848201908152306020828101919091529793909216918790829081906040010381855afa80156105c9578590610631575b61048a915034111561085f565b8451906370a0823160e01b80835230858401528783602481855afa9283156106275786936105f4575b5086516323b872dd60e01b81523386820190815230602082015234604082015289908290819060600103818a875af19081156105ea578992916104fc9189916105d357506108bc565b6024885180948193825230898301525afa9081156105c9578591610596575b5061016a61052a923490610919565b303b156103d557908261055393928551809581926308f5184360e41b835234903087850161097c565b038183305af1610568575b5050505160018152f35b67ffffffffffffffff8311610583575050815238808061055e565b634e487b7160e01b825260419052602490fd5b90508681813d83116105c2575b6105ad8183610732565b810103126105be575161016a61051b565b8480fd5b503d6105a3565b86513d87823e3d90fd5b6103a99150843d86116102eb576102dc8183610732565b88513d89823e3d90fd5b9092508781813d8311610620575b61060c8183610732565b8101031261061c575191386104b3565b8580fd5b503d610602565b87513d88823e3d90fd5b508681813d8311610659575b6106478183610732565b810103126105be5761048a905161047d565b503d61063d565b50346103d55760603660031901126103d55780356001600160a01b038116810361037d576024359067ffffffffffffffff82116105be576106a66020923690850161076a565b84516353266bbb60e01b815293849283926106c7926044359290850161097c565b0381866108005af1908115610702576106e7925083916106ea57506109d8565b80fd5b61034c915060203d81116102eb576102dc8183610732565b505051903d90823e3d90fd5b8490346102ae57816003193601126102ae5790546001600160a01b03168152602090f35b90601f8019910116810190811067ffffffffffffffff82111761075457604052565b634e487b7160e01b600052604160045260246000fd5b81601f820112156107c15780359067ffffffffffffffff8211610754576040519261079f601f8401601f191660200185610732565b828452602083830101116107c157816000926020809301838601378301015290565b600080fd5b9060406003198301126107c1576004356001600160a01b03811681036107c157916024359067ffffffffffffffff82116107c1576108069160040161076a565b90565b1561081057565b60405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6044820152603760f91b6064820152608490fd5b1561086657565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b908160209103126107c1575180151581036107c15790565b156108c357565b60405162461bcd60e51b815260206004820152602860248201527f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60448201526730b9b4103637b0b760c11b6064820152608490fd5b9190820180921161092657565b634e487b7160e01b600052601160045260246000fd5b1561094357565b60405162461bcd60e51b8152602060048201526011602482015270119b185cda081b1bd85b8819985a5b1959607a1b6044820152606490fd5b9392919060018060a01b03168452602060608186015281519182606087015260005b8381106109c45750505060808160008260409488010152601f8019910116850101930152565b81810183015187820160800152820161099e565b156109df57565b60405162461bcd60e51b81526020600482015260126024820152716661696c656420746f2064656c656761746560701b6044820152606490fdfea2646970667358221220623c3a35889e520292f1a8bc7fd77edbb9e309cbac5c431f7a0b2f8a24f625fa64736f6c63430008140033", - "deployedBytecode": "0x6080604081815260048036101561001557600080fd5b600092833560e01c9081638da5cb5b1461070e575080638f518430146106605780639b4f21a9146104195763b86219241461004f57600080fd5b610058366107c6565b84549094916001600160a01b03916100739083163314610809565b8451636eb1769f60e11b815233858201908152306020828101919091529793909216918790829081906040010381855afa801561040f5784906103e0575b6100be915034111561085f565b8451926370a0823160e01b92838552308686015260249488818781875afa9081156102f25783916103af575b5087516323b872dd60e01b8152338882019081523060208201523460408201528a9082908190606001038187895af19081156103885790610132918591610392575b506108bc565b875190858252308883015289828881885afa91821561038857908a92918592610352575b5061018b939161016a610170923490610919565b1461093c565b8851809381926353266bbb60e01b83523490308c850161097c565b0381856108005af190811561032b57906101ac918391610335575b506109d8565b855192808452308685015287848681865afa93841561032b5782946102fc575b50865163a9059cbb60e01b815233878201523486820152888160448186885af180156102f257908992916102c5575b50858851809581938252308a8301525afa9182156102b9578192610286575b503483039283116102745750036102345750505160018152f35b606493601b9293519362461bcd60e51b85528401528201527f466c617368206c6f616e2072657061796d656e74206661696c656400000000006044820152fd5b634e487b7160e01b8152601185528390fd5b9091508681813d83116102b2575b61029e8183610732565b810103126102ae5751903861021a565b5080fd5b503d610294565b508551903d90823e3d90fd5b6102e490833d85116102eb575b6102dc8183610732565b8101906108a4565b50386101fb565b503d6102d2565b88513d85823e3d90fd5b9093508781813d8311610324575b6103148183610732565b810103126102ae575192386101cc565b503d61030a565b87513d84823e3d90fd5b61034c9150893d8b116102eb576102dc8183610732565b386101a6565b8092508391933d8311610381575b61036a8183610732565b8101031261037d57518991610170610156565b8380fd5b503d610360565b89513d86823e3d90fd5b6103a991508b3d8d116102eb576102dc8183610732565b3861012c565b90508881813d83116103d9575b6103c68183610732565b810103126103d55751386100ea565b8280fd5b503d6103bc565b508681813d8311610408575b6103f68183610732565b8101031261037d576100be90516100b1565b503d6103ec565b86513d86823e3d90fd5b5091610424366107c6565b82549094916001600160a01b039161043f9083163314610809565b8451636eb1769f60e11b815233848201908152306020828101919091529793909216918790829081906040010381855afa80156105c9578590610631575b61048a915034111561085f565b8451906370a0823160e01b80835230858401528783602481855afa9283156106275786936105f4575b5086516323b872dd60e01b81523386820190815230602082015234604082015289908290819060600103818a875af19081156105ea578992916104fc9189916105d357506108bc565b6024885180948193825230898301525afa9081156105c9578591610596575b5061016a61052a923490610919565b303b156103d557908261055393928551809581926308f5184360e41b835234903087850161097c565b038183305af1610568575b5050505160018152f35b67ffffffffffffffff8311610583575050815238808061055e565b634e487b7160e01b825260419052602490fd5b90508681813d83116105c2575b6105ad8183610732565b810103126105be575161016a61051b565b8480fd5b503d6105a3565b86513d87823e3d90fd5b6103a99150843d86116102eb576102dc8183610732565b88513d89823e3d90fd5b9092508781813d8311610620575b61060c8183610732565b8101031261061c575191386104b3565b8580fd5b503d610602565b87513d88823e3d90fd5b508681813d8311610659575b6106478183610732565b810103126105be5761048a905161047d565b503d61063d565b50346103d55760603660031901126103d55780356001600160a01b038116810361037d576024359067ffffffffffffffff82116105be576106a66020923690850161076a565b84516353266bbb60e01b815293849283926106c7926044359290850161097c565b0381866108005af1908115610702576106e7925083916106ea57506109d8565b80fd5b61034c915060203d81116102eb576102dc8183610732565b505051903d90823e3d90fd5b8490346102ae57816003193601126102ae5790546001600160a01b03168152602090f35b90601f8019910116810190811067ffffffffffffffff82111761075457604052565b634e487b7160e01b600052604160045260246000fd5b81601f820112156107c15780359067ffffffffffffffff8211610754576040519261079f601f8401601f191660200185610732565b828452602083830101116107c157816000926020809301838601378301015290565b600080fd5b9060406003198301126107c1576004356001600160a01b03811681036107c157916024359067ffffffffffffffff82116107c1576108069160040161076a565b90565b1561081057565b60405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6044820152603760f91b6064820152608490fd5b1561086657565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b908160209103126107c1575180151581036107c15790565b156108c357565b60405162461bcd60e51b815260206004820152602860248201527f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60448201526730b9b4103637b0b760c11b6064820152608490fd5b9190820180921161092657565b634e487b7160e01b600052601160045260246000fd5b1561094357565b60405162461bcd60e51b8152602060048201526011602482015270119b185cda081b1bd85b8819985a5b1959607a1b6044820152606490fd5b9392919060018060a01b03168452602060608186015281519182606087015260005b8381106109c45750505060808160008260409488010152601f8019910116850101930152565b81810183015187820160800152820161099e565b156109df57565b60405162461bcd60e51b81526020600482015260126024820152716661696c656420746f2064656c656761746560701b6044820152606490fdfea2646970667358221220623c3a35889e520292f1a8bc7fd77edbb9e309cbac5c431f7a0b2f8a24f625fa64736f6c63430008140033", + "bytecode": "0x608080604052346026575f80546001600160a01b03191633179055610a2d908161002b8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c9081638da5cb5b14610713575080638f5184301461066d5780639b4f21a91461044a5763b86219241461004a575f80fd5b610053366107c1565b919061006960018060a01b03835416331461089e565b604051636eb1769f60e11b81523360048201523060248201526001600160a01b03919091169290602081604481875afa8015610317578390610416575b6100b391503411156108f4565b6040516370a0823160e01b815230600482015290602082602481875afa9182156103175783926103e2575b506040516323b872dd60e01b815233600482015230602482015234604482015260208160648187895af19081156103b857906101219185916103c3575b50610939565b6040516370a0823160e01b815230600482015291602083602481885afa9283156103b8578493610380575b5090610168610185936101626020943490610996565b146109b7565b604051809381926353266bbb60e01b83523490306004850161081c565b0381856108005af190811561035657906101a6918391610361575b5061085d565b6040516370a0823160e01b815230600482015291602083602481845afa928315610356578293610322575b5060405163a9059cbb60e01b815233600482015234602482015260208160448186865af18015610317576024939260209290916102ec575b506040516370a0823160e01b815230600482015293849182905afa9182156102df5781926102a7575b5034830392831161029357500361024e57602060405160018152f35b60405162461bcd60e51b815260206004820152601b60248201527f466c617368206c6f616e2072657061796d656e74206661696c656400000000006044820152606490fd5b634e487b7160e01b81526011600452602490fd5b9091506020813d6020116102d7575b816102c360209383610735565b810103126102d35751905f610232565b5f80fd5b3d91506102b6565b50604051903d90823e3d90fd5b61030b90833d8511610310575b6103038183610735565b810190610804565b610209565b503d6102f9565b6040513d85823e3d90fd5b9092506020813d60201161034e575b8161033e60209383610735565b810103126102d35751915f6101d1565b3d9150610331565b6040513d84823e3d90fd5b61037a915060203d602011610310576103038183610735565b5f6101a0565b9250906020833d6020116103b0575b8161039c60209383610735565b810103126102d3579151919061016861014c565b3d915061038f565b6040513d86823e3d90fd5b6103dc915060203d602011610310576103038183610735565b5f61011b565b9091506020813d60201161040e575b816103fe60209383610735565b810103126102d35751905f6100de565b3d91506103f1565b506020813d602011610442575b8161043060209383610735565b810103126102d3576100b390516100a6565b3d9150610423565b610453366107c1565b9061046860018060a01b035f5416331461089e565b604051636eb1769f60e11b81523360048201523060248201526001600160a01b039190911690602081604481855afa80156105df575f90610639575b6104b191503411156108f4565b6040516370a0823160e01b8152306004820152602081602481855afa9081156105df575f91610607575b506040516323b872dd60e01b8152336004820152306024820152346044820152916020836064815f855af19081156105df576105226020926024955f916105ea5750610939565b6040516370a0823160e01b815230600482015293849182905afa9182156105df575f926105a9575b509061016261055a923490610996565b303b156102d3575f61058391604051809381926308f5184360e41b83523490306004850161081c565b038183305af1610599575b602060405160018152f35b5f6105a391610735565b5f61058e565b91506020823d6020116105d7575b816105c460209383610735565b810103126102d35790519061016261054a565b3d91506105b7565b6040513d5f823e3d90fd5b6106019150843d8611610310576103038183610735565b8761011b565b90506020813d602011610631575b8161062260209383610735565b810103126102d35751836104db565b3d9150610615565b506020813d602011610665575b8161065360209383610735565b810103126102d3576104b190516104a4565b3d9150610646565b346102d35760603660031901126102d3576004356001600160a01b03811681036102d35760243567ffffffffffffffff81116102d3576106d6916106b7602092369060040161076b565b6040516353266bbb60e01b81529384928392604435916004850161081c565b03815f6108005af180156105df576102d3915f916106f4575061085d565b61070d915060203d602011610310576103038183610735565b826101a0565b346102d3575f3660031901126102d3575f546001600160a01b03168152602090f35b90601f8019910116810190811067ffffffffffffffff82111761075757604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102d35780359067ffffffffffffffff821161075757604051926107a0601f8401601f191660200185610735565b828452602083830101116102d357815f926020809301838601378301015290565b9060406003198301126102d3576004356001600160a01b03811681036102d357916024359067ffffffffffffffff82116102d3576108019160040161076b565b90565b908160209103126102d3575180151581036102d35790565b939291602060809160409360018060a01b0316875260608288015280519182918260608a0152018388015e5f828288010152601f8019910116850101930152565b1561086457565b60405162461bcd60e51b81526020600482015260126024820152716661696c656420746f2064656c656761746560701b6044820152606490fd5b156108a557565b60405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6044820152603760f91b6064820152608490fd5b156108fb57565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b1561094057565b60405162461bcd60e51b815260206004820152602860248201527f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60448201526730b9b4103637b0b760c11b6064820152608490fd5b919082018092116109a357565b634e487b7160e01b5f52601160045260245ffd5b156109be57565b60405162461bcd60e51b8152602060048201526011602482015270119b185cda081b1bd85b8819985a5b1959607a1b6044820152606490fdfea2646970667358221220901de5336c85bb7adad7e36715428809cae878a6e2e4d2be32e7a32c508ca24f64736f6c634300081a0033", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f905f3560e01c9081638da5cb5b14610713575080638f5184301461066d5780639b4f21a91461044a5763b86219241461004a575f80fd5b610053366107c1565b919061006960018060a01b03835416331461089e565b604051636eb1769f60e11b81523360048201523060248201526001600160a01b03919091169290602081604481875afa8015610317578390610416575b6100b391503411156108f4565b6040516370a0823160e01b815230600482015290602082602481875afa9182156103175783926103e2575b506040516323b872dd60e01b815233600482015230602482015234604482015260208160648187895af19081156103b857906101219185916103c3575b50610939565b6040516370a0823160e01b815230600482015291602083602481885afa9283156103b8578493610380575b5090610168610185936101626020943490610996565b146109b7565b604051809381926353266bbb60e01b83523490306004850161081c565b0381856108005af190811561035657906101a6918391610361575b5061085d565b6040516370a0823160e01b815230600482015291602083602481845afa928315610356578293610322575b5060405163a9059cbb60e01b815233600482015234602482015260208160448186865af18015610317576024939260209290916102ec575b506040516370a0823160e01b815230600482015293849182905afa9182156102df5781926102a7575b5034830392831161029357500361024e57602060405160018152f35b60405162461bcd60e51b815260206004820152601b60248201527f466c617368206c6f616e2072657061796d656e74206661696c656400000000006044820152606490fd5b634e487b7160e01b81526011600452602490fd5b9091506020813d6020116102d7575b816102c360209383610735565b810103126102d35751905f610232565b5f80fd5b3d91506102b6565b50604051903d90823e3d90fd5b61030b90833d8511610310575b6103038183610735565b810190610804565b610209565b503d6102f9565b6040513d85823e3d90fd5b9092506020813d60201161034e575b8161033e60209383610735565b810103126102d35751915f6101d1565b3d9150610331565b6040513d84823e3d90fd5b61037a915060203d602011610310576103038183610735565b5f6101a0565b9250906020833d6020116103b0575b8161039c60209383610735565b810103126102d3579151919061016861014c565b3d915061038f565b6040513d86823e3d90fd5b6103dc915060203d602011610310576103038183610735565b5f61011b565b9091506020813d60201161040e575b816103fe60209383610735565b810103126102d35751905f6100de565b3d91506103f1565b506020813d602011610442575b8161043060209383610735565b810103126102d3576100b390516100a6565b3d9150610423565b610453366107c1565b9061046860018060a01b035f5416331461089e565b604051636eb1769f60e11b81523360048201523060248201526001600160a01b039190911690602081604481855afa80156105df575f90610639575b6104b191503411156108f4565b6040516370a0823160e01b8152306004820152602081602481855afa9081156105df575f91610607575b506040516323b872dd60e01b8152336004820152306024820152346044820152916020836064815f855af19081156105df576105226020926024955f916105ea5750610939565b6040516370a0823160e01b815230600482015293849182905afa9182156105df575f926105a9575b509061016261055a923490610996565b303b156102d3575f61058391604051809381926308f5184360e41b83523490306004850161081c565b038183305af1610599575b602060405160018152f35b5f6105a391610735565b5f61058e565b91506020823d6020116105d7575b816105c460209383610735565b810103126102d35790519061016261054a565b3d91506105b7565b6040513d5f823e3d90fd5b6106019150843d8611610310576103038183610735565b8761011b565b90506020813d602011610631575b8161062260209383610735565b810103126102d35751836104db565b3d9150610615565b506020813d602011610665575b8161065360209383610735565b810103126102d3576104b190516104a4565b3d9150610646565b346102d35760603660031901126102d3576004356001600160a01b03811681036102d35760243567ffffffffffffffff81116102d3576106d6916106b7602092369060040161076b565b6040516353266bbb60e01b81529384928392604435916004850161081c565b03815f6108005af180156105df576102d3915f916106f4575061085d565b61070d915060203d602011610310576103038183610735565b826101a0565b346102d3575f3660031901126102d3575f546001600160a01b03168152602090f35b90601f8019910116810190811067ffffffffffffffff82111761075757604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102d35780359067ffffffffffffffff821161075757604051926107a0601f8401601f191660200185610735565b828452602083830101116102d357815f926020809301838601378301015290565b9060406003198301126102d3576004356001600160a01b03811681036102d357916024359067ffffffffffffffff82116102d3576108019160040161076b565b90565b908160209103126102d3575180151581036102d35790565b939291602060809160409360018060a01b0316875260608288015280519182918260608a0152018388015e5f828288010152601f8019910116850101930152565b1561086457565b60405162461bcd60e51b81526020600482015260126024820152716661696c656420746f2064656c656761746560701b6044820152606490fd5b156108a557565b60405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6044820152603760f91b6064820152608490fd5b156108fb57565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b1561094057565b60405162461bcd60e51b815260206004820152602860248201527f4661696c656420746f207472616e7366657220746f6b656e7320666f7220666c60448201526730b9b4103637b0b760c11b6064820152608490fd5b919082018092116109a357565b634e487b7160e01b5f52601160045260245ffd5b156109be57565b60405162461bcd60e51b8152602060048201526011602482015270119b185cda081b1bd85b8819985a5b1959607a1b6044820152606490fdfea2646970667358221220901de5336c85bb7adad7e36715428809cae878a6e2e4d2be32e7a32c508ca24f64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/testutil/contracts/FlashLoan.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/testutil/contracts/GovCaller.json b/precompiles/testutil/contracts/GovCaller.json index 159ac53ee..e9349a478 100644 --- a/precompiles/testutil/contracts/GovCaller.json +++ b/precompiles/testutil/contracts/GovCaller.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "GovCaller", "sourceName": "solidity/precompiles/testutil/contracts/GovCaller.sol", "abi": [ @@ -652,8 +652,11 @@ "type": "receive" } ], - "bytecode": "0x6080806040523461001657611db3908161001c8239f35b600080fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630f6265fb14611276578063258691e21461112d57806326c11ffa14610ff65780635e615a6b14610b7557806361bc221a14610b5457806361f09ad214610ae757806372ff5ec4146109a35780637726ece0146108445780638e7431d3146107cb57806391d6d8e71461068d57806397fd84d214610601578063b94c9822146103d8578063bc7bdf7514610326578063d0e30db014610318578063e8702c34146102545763ed6c08f70361000e5760a03660031901126101f4576100e4611713565b6100ec611729565b604435916001600160401b038084116101f45761010f6020943690600401611944565b949061011961186f565b9461012261187e565b9561020d575b610147604051978893849363592581bb60e11b85523060048601611ad5565b038160006108055af1928315610201576000936101c1575b60209450610174575b50506040519015158152f35b60008080600f6101ba95829583549061018f8260070b611b02565b67ffffffffffffffff1990921691161783556001600160a01b03165af16101b4611b1a565b50611b4a565b3880610168565b92506020843d82116101f9575b816101db602093836117cf565b810103126101f4576101ee602094611aa5565b9261015f565b600080fd5b3d91506101ce565b6040513d6000823e3d90fd5b60005461021c8160070b611b02565b67ffffffffffffffff1990911690851617600090815561024f90808080600f6001600160a01b038b165af16101b4611b1a565b610128565b60603660031901126101f457610268611713565b6001600160401b036024358181116101f457610288903690600401611755565b9290604435918383116101f4576102c46102a86020943690600401611944565b90604051978895869563a8fdc91960e01b875260048701611a71565b038160006108055af1908115610201576020926000926102e9575b5060405191168152f35b61030a919250833d8111610311575b61030281836117cf565b81019061198b565b90836102df565b503d6102f8565b60003660031901126101f457005b60403660031901126101f45761033a61173f565b6024356001600160401b0381116101f45761035b6020913690600401611944565b9261037b604051948593849363592581bb60e11b85523060048601611ad5565b038160006108055af180156102015760009061039f575b6020906040519015158152f35b506020813d82116103d0575b816103b8602093836117cf565b810103126101f4576103cb602091611aa5565b610392565b3d91506103ab565b346101f45760603660031901126101f4576103f1611713565b6024356001600160401b0381116101f457610410903690600401611842565b6001600160401b03604435116101f4573660236044350112156101f457604435600401359061043e82611974565b9161044c60405193846117cf565b80835260208301903660248260051b6044350101116101f457602460443501915b60248260051b604435010183106105855750505060005460018160070b0190677fffffffffffffff1992677fffffffffffffff9584841287851317610533576020926001600160401b031980956001600160401b03169116176000556104e76040519687938493631758efa960e11b855260048501611d47565b038160006108015af192831561020157600093610549575b50600054916000198360070b0194851390851217610533576020936001600160401b03169116176000556040519015158152f35b634e487b7160e01b600052601160045260246000fd5b9092506020813d60201161057d575b81610565602093836117cf565b810103126101f45761057690611aa5565b91846104ff565b3d9150610558565b82356001600160401b0381116101f45760406044358201360360231901126101f457604051906105b482611782565b6001600160401b03602482604435010135116101f45760249260209283926044906105e93683358301808a0135018901611842565b8352813501013583820152815201930192905061046d565b6020806003193601126101f4576106358161061a61173f565b6040518093819263519f184360e11b83523060048401611ab2565b038160006108055af190811561020157600091610658575b506040519015158152f35b90508181813d8311610686575b61066f81836117cf565b810103126101f45761068090611aa5565b8261064d565b503d610665565b60803660031901126101f4576001600160401b036004358181116101f4576106b9903690600401611755565b90916024358181116101f4576106d56020913690600401611944565b93909461070e6106e3611860565b956106ec61186f565b96610791575b60405163a8fdc91960e01b815297889485943060048701611a71565b038160006108055af191821561020157602093600093610772575b50610738575b60405191168152f35b6000546107478160070b611b02565b8216906001600160401b0319161760005561076d6000808080600f335af16101b4611b1a565b61072f565b61078a919350843d81116103115761030281836117cf565b9184610729565b6000546107a08160070b611b02565b8716906001600160401b031916176000556107c66000808080600f335af16101b4611b1a565b6106f2565b60603660031901126101f4576107df611713565b6107e7611729565b604435906001600160401b03928383116101f45761037b61080e6020943690600401611944565b604051968795869563592581bb60e11b875260018060a01b031660048701521660248501526060604485015260648401916119cb565b60a03660031901126101f457610858611713565b6001600160401b036024358181116101f457610878903690600401611755565b9190926044358281116101f4576108956020913690600401611944565b9490956108ce6108a361186f565b966108ac61187e565b9761095c575b60405163a8fdc91960e01b815298899485943060048701611a71565b038160006108055af19283156102015760209460009461093d575b506108f8575060405191168152f35b6000808080600f6109379582546109118160070b611b02565b67ffffffffffffffff199091169089161783556001600160a01b03165af16101b4611b1a565b836102df565b610955919450853d81116103115761030281836117cf565b92856108e9565b60005461096b8160070b611b02565b67ffffffffffffffff1990911690881617600090815561099e90808080600f6001600160a01b038c165af16101b4611b1a565b6108b2565b60803660031901126101f4576109b761173f565b602435906001600160401b038083116101f4576109da6020933690600401611944565b93906109e4611860565b936109ed61186f565b94610aad575b610a12604051968793849363592581bb60e11b85523060048601611ad5565b038160006108055af191821561020157600092610a72575b60209350610a3d57506040519015158152f35b60005490610a4d8260070b611b02565b16906001600160401b031916176000556106806000808080600f335af16101b4611b1a565b91506020833d8211610aa5575b81610a8c602093836117cf565b810103126101f457610a9f602093611aa5565b91610a2a565b3d9150610a7f565b600054610abc8160070b611b02565b8516906001600160401b03191617600055610ae26000808080600f335af16101b4611b1a565b6109f3565b60403660031901126101f4576001600160401b036004358181116101f457610b13903690600401611755565b602492919235908282116101f4576102c493610b356020933690600401611944565b60405163a8fdc91960e01b815296879485949193913060048701611a71565b346101f45760003660031901126101f457602060005460070b604051908152f35b346101f45760003660031901126101f45760606101e0604051610b97816117b3565b600081528260208201526000604082015282808201528260808201528260a08201528260c08201528260e08201528261010082015260006101208201528261014082015282610160820152600061018082015260006101a082015260006101c08201520152604051635e615a6b60e01b81526000816004816108055afa801561020157600090610d7b575b610d779060405191829160208352805160070b60208401526080836101e0610d3e610d28610d03610ced610cd8610cc4610cb0610c9a8b60208101519a6060610c796102009d8e60408501526102208401906118d5565b92604081015160070b82840152015190601f199d8e828503019101526118b0565b8d60808d01519060a08d828503019101526118b0565b60a08b01518d82038b0160c08f01526118b0565b60c08a01518c82038a0160e08e01526118b0565b60e0890151888c8303016101008d01526118b0565b610100880151878b8303016101208c01526118b0565b61012087015160070b6101408a0152610140870151868a8303016101608b01526118b0565b61016086015185898303016101808a01526118d5565b9361018081015115156101a08801526101a081015115156101c08801526101c081015115158288015201519185840301908501526118b0565b0390f35b503d90816000823e610d8d82826117cf565b60208183810103126101f4578051916001600160401b0383116101f45761020083830182840103126101f45760405191610dc6836117b3565b610dd1848201611b95565b8352602084820101516001600160401b0381116101f457610df9908383019086840101611be5565b6020840152610e0c604085830101611b95565b6040840152606084820101516001600160401b0381116101f457610e37908383019086840101611ba3565b6060840152608084820101516001600160401b0381116101f457610e62908383019086840101611ba3565b608084015260a084820101516001600160401b0381116101f457610e8d908383019086840101611ba3565b60a084015260c084820101516001600160401b0381116101f457610eb8908383019086840101611ba3565b60c084015260e084820101516001600160401b0381116101f457610ee3908383019086840101611ba3565b60e084015261010084820101516001600160401b0381116101f457610f0f908383019086840101611ba3565b610100840152610f2461012085830101611b95565b61012084015261014084820101516001600160401b0381116101f457610f51908383019086840101611ba3565b61014084015261016084820101516001600160401b0381116101f457610f7e908383019086840101611be5565b610160840152610f9361018085830101611aa5565b610180840152610fa86101a085830101611aa5565b6101a0840152610fbd6101c085830101611aa5565b6101c08401526101e084820101516001600160401b0381116101f457610d7794610feb938301920101611ba3565b6101e0820152610c22565b60603660031901126101f45761100a61173f565b60243580151581036101f457602061104592611024611860565b926110ec575b6040518094819263519f184360e11b83523060048401611ab2565b038160006108055af1908115610201576000916110b1575b60209250611070575b6040519015158152f35b60005461107f8160070b611b02565b6001600160401b0316906001600160401b031916176000556110ac6000808080600f335af16101b4611b1a565b611066565b90506020823d82116110e4575b816110cb602093836117cf565b810103126101f4576110de602092611aa5565b9061105d565b3d91506110be565b6000546110fb8160070b611b02565b6001600160401b0316906001600160401b031916176000556111286000808080600f335af16101b4611b1a565b61102a565b60803660031901126101f457611181611144611713565b61114c611729565b906020611157611860565b9261116061186f565b9361122d575b6040518095819263519f184360e11b83523060048401611ab2565b038160006108055af1918215610201576000926111f2575b602093506111ac57506040519015158152f35b6000808080600f6106809582546111c58160070b611b02565b6001600160401b031667ffffffffffffffff19919091161783556001600160a01b03165af16101b4611b1a565b91506020833d8211611225575b8161120c602093836117cf565b810103126101f45761121f602093611aa5565b91611199565b3d91506111ff565b60005461123c8160070b611b02565b6001600160401b0316906001600160401b031916176000556112716000808080600f60018060a01b0389165af16101b4611b1a565b611166565b60803660031901126101f45761128a611713565b611292611729565b9060448035916001600160401b03928381116101f4576112b6903690600401611755565b93909160649485358381116101f4576112d3903690600401611842565b9160018060a01b0316926000546112ec8160070b611b02565b82166001600160401b03198092161760005560008080806001895af1611310611b1a565b50156116c65761133a97986040519063519f184360e11b8252818060209b8c933060048401611ab2565b038160006108055af16000918161168f575b5061142b5789898961135c611c98565b6308c379a0146113a7575b7f63616e63656c50726f706f73616c206661696c65642073696c656e746c790000906040519262461bcd60e51b84526004840152601e6024840152820152fd5b6113af611cb6565b806113ba5750611367565b826114066037604051809476031b0b731b2b6283937b837b9b0b6103330b4b632b21d1604d1b858301526113f68151809287868601910161188d565b81010360178101855201836117cf565b61142760405192839262461bcd60e51b8452600484015260248301906118b0565b0390fd5b1561164c5790879492959391600054916114478360070b611b02565b169116176000556040519261145b84611782565b6001845260005b85811061161c5750946114866114c1966040519261147f84611782565b369161180b565b815260028582015261149784611d24565b526114a183611d24565b506000604051809681958294635ca64c1160e11b84528660048501611d47565b03925af1600091816115e5575b5061159757506114dc611c98565b6308c379a014611532575b6084927f66756e64436f6d6d756e697479506f6f6c206661696c65642073696c656e746c607960f81b926040519462461bcd60e51b8652600486015260216024860152840152820152fd5b61153a611cb6565b8061154557506114e7565b82611406603a60405180947f66756e64436f6d6d756e697479506f6f6c206661696c65643a20000000000000858301526115878151809287868601910161188d565b810103601a8101855201836117cf565b156115a6575060405160018152f35b7f66756e64436f6d6d756e697479506f6f6c2072657475726e65642066616c7365906040519262461bcd60e51b84528060048501526024840152820152fd5b9091508381813d8311611615575b6115fd81836117cf565b810103126101f45761160e90611aa5565b90856114ce565b503d6115f3565b6040969395919294965161162f81611782565b606081526000838201528282890101520190879492959391611462565b60405162461bcd60e51b815260048101899052601d60248201527f63616e63656c50726f706f73616c2072657475726e65642066616c7365000000818901528990fd5b9091508981813d83116116bf575b6116a781836117cf565b810103126101f4576116b890611aa5565b908b61134c565b503d61169d565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f206465706f7369746f81890152603960f91b818a0152608490fd5b600435906001600160a01b03821682036101f457565b602435906001600160401b03821682036101f457565b600435906001600160401b03821682036101f457565b9181601f840112156101f4578235916001600160401b0383116101f457602083818601950101116101f457565b604081019081106001600160401b0382111761179d57604052565b634e487b7160e01b600052604160045260246000fd5b61020081019081106001600160401b0382111761179d57604052565b90601f801991011681019081106001600160401b0382111761179d57604052565b6001600160401b03811161179d57601f01601f191660200190565b929192611817826117f0565b9161182560405193846117cf565b8294818452818301116101f4578281602093846000960137010152565b9080601f830112156101f45781602061185d9335910161180b565b90565b6044359081151582036101f457565b6064359081151582036101f457565b6084359081151582036101f457565b60005b8381106118a05750506000910152565b8181015183820152602001611890565b906020916118c98151809281855285808601910161188d565b601f01601f1916010190565b908082519081815260208091019281808460051b8301019501936000915b8483106119035750505050505090565b9091929394958480600192601f19858203018652895190828061192e845160408086528501906118b0565b93015191015298019301930191949392906118f3565b9181601f840112156101f4578235916001600160401b0383116101f4576020808501948460051b0101116101f457565b6001600160401b03811161179d5760051b60200190565b908160209103126101f457516001600160401b03811681036101f45790565b908060209392818452848401376000828201840152601f01601f1916010190565b9080835260208093019081938160051b830194846000915b8483106119f4575050505050505090565b9091929394959681810387528735603e19843603018112156101f45783018035601e19823603018112156101f4578101908682359201906001600160401b0383116101f45782360382136101f4576001938880611a5c819695829660408087528601916119aa565b930135910152990197019594930191906119e3565b939161185d9593611a979260018060a01b031686526060602087015260608601916119aa565b9260408185039101526119cb565b519081151582036101f457565b6001600160a01b0390911681526001600160401b03909116602082015260400190565b6001600160401b0361185d959360609360018060a01b0316835216602082015281604082015201916119cb565b60070b677fffffffffffffff81146105335760010190565b3d15611b45573d90611b2b826117f0565b91611b3960405193846117cf565b82523d6000602084013e565b606090565b15611b5157565b606460405162461bcd60e51b815260206004820152602060248201527f4661696c656420746f2073656e6420457468657220746f2070726f706f7365726044820152fd5b51908160070b82036101f457565b81601f820112156101f4578051611bb9816117f0565b92611bc760405194856117cf565b818452602082840101116101f45761185d916020808501910161188d565b81601f820112156101f4578051611bfb81611974565b92604091611c0b835195866117cf565b808552602093848087019260051b820101938385116101f457858201925b858410611c3a575050505050505090565b8351906001600160401b03918281116101f45784019083601f1983890301126101f4578351611c6881611782565b898301519384116101f4578483611c858a8d809881980101611ba3565b8352015183820152815201930192611c29565b60009060033d11611ca557565b905060046000803e60005160e01c90565b600060443d1061185d57604051600319913d83016004833e81516001600160401b03918282113d602484011117611d1357818401948551938411611d1b573d85010160208487010111611d13575061185d929101602001906117cf565b949350505050565b50949350505050565b805115611d315760200190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909116815260606020820181905261185d939192611d6f918401906118b0565b9160408184039101526118d556fea2646970667358221220c9625558987b92b3d3d39d698b4548091cb23adaf68209787374d331e395f0ec64736f6c63430008140033", - "deployedBytecode": "0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630f6265fb14611276578063258691e21461112d57806326c11ffa14610ff65780635e615a6b14610b7557806361bc221a14610b5457806361f09ad214610ae757806372ff5ec4146109a35780637726ece0146108445780638e7431d3146107cb57806391d6d8e71461068d57806397fd84d214610601578063b94c9822146103d8578063bc7bdf7514610326578063d0e30db014610318578063e8702c34146102545763ed6c08f70361000e5760a03660031901126101f4576100e4611713565b6100ec611729565b604435916001600160401b038084116101f45761010f6020943690600401611944565b949061011961186f565b9461012261187e565b9561020d575b610147604051978893849363592581bb60e11b85523060048601611ad5565b038160006108055af1928315610201576000936101c1575b60209450610174575b50506040519015158152f35b60008080600f6101ba95829583549061018f8260070b611b02565b67ffffffffffffffff1990921691161783556001600160a01b03165af16101b4611b1a565b50611b4a565b3880610168565b92506020843d82116101f9575b816101db602093836117cf565b810103126101f4576101ee602094611aa5565b9261015f565b600080fd5b3d91506101ce565b6040513d6000823e3d90fd5b60005461021c8160070b611b02565b67ffffffffffffffff1990911690851617600090815561024f90808080600f6001600160a01b038b165af16101b4611b1a565b610128565b60603660031901126101f457610268611713565b6001600160401b036024358181116101f457610288903690600401611755565b9290604435918383116101f4576102c46102a86020943690600401611944565b90604051978895869563a8fdc91960e01b875260048701611a71565b038160006108055af1908115610201576020926000926102e9575b5060405191168152f35b61030a919250833d8111610311575b61030281836117cf565b81019061198b565b90836102df565b503d6102f8565b60003660031901126101f457005b60403660031901126101f45761033a61173f565b6024356001600160401b0381116101f45761035b6020913690600401611944565b9261037b604051948593849363592581bb60e11b85523060048601611ad5565b038160006108055af180156102015760009061039f575b6020906040519015158152f35b506020813d82116103d0575b816103b8602093836117cf565b810103126101f4576103cb602091611aa5565b610392565b3d91506103ab565b346101f45760603660031901126101f4576103f1611713565b6024356001600160401b0381116101f457610410903690600401611842565b6001600160401b03604435116101f4573660236044350112156101f457604435600401359061043e82611974565b9161044c60405193846117cf565b80835260208301903660248260051b6044350101116101f457602460443501915b60248260051b604435010183106105855750505060005460018160070b0190677fffffffffffffff1992677fffffffffffffff9584841287851317610533576020926001600160401b031980956001600160401b03169116176000556104e76040519687938493631758efa960e11b855260048501611d47565b038160006108015af192831561020157600093610549575b50600054916000198360070b0194851390851217610533576020936001600160401b03169116176000556040519015158152f35b634e487b7160e01b600052601160045260246000fd5b9092506020813d60201161057d575b81610565602093836117cf565b810103126101f45761057690611aa5565b91846104ff565b3d9150610558565b82356001600160401b0381116101f45760406044358201360360231901126101f457604051906105b482611782565b6001600160401b03602482604435010135116101f45760249260209283926044906105e93683358301808a0135018901611842565b8352813501013583820152815201930192905061046d565b6020806003193601126101f4576106358161061a61173f565b6040518093819263519f184360e11b83523060048401611ab2565b038160006108055af190811561020157600091610658575b506040519015158152f35b90508181813d8311610686575b61066f81836117cf565b810103126101f45761068090611aa5565b8261064d565b503d610665565b60803660031901126101f4576001600160401b036004358181116101f4576106b9903690600401611755565b90916024358181116101f4576106d56020913690600401611944565b93909461070e6106e3611860565b956106ec61186f565b96610791575b60405163a8fdc91960e01b815297889485943060048701611a71565b038160006108055af191821561020157602093600093610772575b50610738575b60405191168152f35b6000546107478160070b611b02565b8216906001600160401b0319161760005561076d6000808080600f335af16101b4611b1a565b61072f565b61078a919350843d81116103115761030281836117cf565b9184610729565b6000546107a08160070b611b02565b8716906001600160401b031916176000556107c66000808080600f335af16101b4611b1a565b6106f2565b60603660031901126101f4576107df611713565b6107e7611729565b604435906001600160401b03928383116101f45761037b61080e6020943690600401611944565b604051968795869563592581bb60e11b875260018060a01b031660048701521660248501526060604485015260648401916119cb565b60a03660031901126101f457610858611713565b6001600160401b036024358181116101f457610878903690600401611755565b9190926044358281116101f4576108956020913690600401611944565b9490956108ce6108a361186f565b966108ac61187e565b9761095c575b60405163a8fdc91960e01b815298899485943060048701611a71565b038160006108055af19283156102015760209460009461093d575b506108f8575060405191168152f35b6000808080600f6109379582546109118160070b611b02565b67ffffffffffffffff199091169089161783556001600160a01b03165af16101b4611b1a565b836102df565b610955919450853d81116103115761030281836117cf565b92856108e9565b60005461096b8160070b611b02565b67ffffffffffffffff1990911690881617600090815561099e90808080600f6001600160a01b038c165af16101b4611b1a565b6108b2565b60803660031901126101f4576109b761173f565b602435906001600160401b038083116101f4576109da6020933690600401611944565b93906109e4611860565b936109ed61186f565b94610aad575b610a12604051968793849363592581bb60e11b85523060048601611ad5565b038160006108055af191821561020157600092610a72575b60209350610a3d57506040519015158152f35b60005490610a4d8260070b611b02565b16906001600160401b031916176000556106806000808080600f335af16101b4611b1a565b91506020833d8211610aa5575b81610a8c602093836117cf565b810103126101f457610a9f602093611aa5565b91610a2a565b3d9150610a7f565b600054610abc8160070b611b02565b8516906001600160401b03191617600055610ae26000808080600f335af16101b4611b1a565b6109f3565b60403660031901126101f4576001600160401b036004358181116101f457610b13903690600401611755565b602492919235908282116101f4576102c493610b356020933690600401611944565b60405163a8fdc91960e01b815296879485949193913060048701611a71565b346101f45760003660031901126101f457602060005460070b604051908152f35b346101f45760003660031901126101f45760606101e0604051610b97816117b3565b600081528260208201526000604082015282808201528260808201528260a08201528260c08201528260e08201528261010082015260006101208201528261014082015282610160820152600061018082015260006101a082015260006101c08201520152604051635e615a6b60e01b81526000816004816108055afa801561020157600090610d7b575b610d779060405191829160208352805160070b60208401526080836101e0610d3e610d28610d03610ced610cd8610cc4610cb0610c9a8b60208101519a6060610c796102009d8e60408501526102208401906118d5565b92604081015160070b82840152015190601f199d8e828503019101526118b0565b8d60808d01519060a08d828503019101526118b0565b60a08b01518d82038b0160c08f01526118b0565b60c08a01518c82038a0160e08e01526118b0565b60e0890151888c8303016101008d01526118b0565b610100880151878b8303016101208c01526118b0565b61012087015160070b6101408a0152610140870151868a8303016101608b01526118b0565b61016086015185898303016101808a01526118d5565b9361018081015115156101a08801526101a081015115156101c08801526101c081015115158288015201519185840301908501526118b0565b0390f35b503d90816000823e610d8d82826117cf565b60208183810103126101f4578051916001600160401b0383116101f45761020083830182840103126101f45760405191610dc6836117b3565b610dd1848201611b95565b8352602084820101516001600160401b0381116101f457610df9908383019086840101611be5565b6020840152610e0c604085830101611b95565b6040840152606084820101516001600160401b0381116101f457610e37908383019086840101611ba3565b6060840152608084820101516001600160401b0381116101f457610e62908383019086840101611ba3565b608084015260a084820101516001600160401b0381116101f457610e8d908383019086840101611ba3565b60a084015260c084820101516001600160401b0381116101f457610eb8908383019086840101611ba3565b60c084015260e084820101516001600160401b0381116101f457610ee3908383019086840101611ba3565b60e084015261010084820101516001600160401b0381116101f457610f0f908383019086840101611ba3565b610100840152610f2461012085830101611b95565b61012084015261014084820101516001600160401b0381116101f457610f51908383019086840101611ba3565b61014084015261016084820101516001600160401b0381116101f457610f7e908383019086840101611be5565b610160840152610f9361018085830101611aa5565b610180840152610fa86101a085830101611aa5565b6101a0840152610fbd6101c085830101611aa5565b6101c08401526101e084820101516001600160401b0381116101f457610d7794610feb938301920101611ba3565b6101e0820152610c22565b60603660031901126101f45761100a61173f565b60243580151581036101f457602061104592611024611860565b926110ec575b6040518094819263519f184360e11b83523060048401611ab2565b038160006108055af1908115610201576000916110b1575b60209250611070575b6040519015158152f35b60005461107f8160070b611b02565b6001600160401b0316906001600160401b031916176000556110ac6000808080600f335af16101b4611b1a565b611066565b90506020823d82116110e4575b816110cb602093836117cf565b810103126101f4576110de602092611aa5565b9061105d565b3d91506110be565b6000546110fb8160070b611b02565b6001600160401b0316906001600160401b031916176000556111286000808080600f335af16101b4611b1a565b61102a565b60803660031901126101f457611181611144611713565b61114c611729565b906020611157611860565b9261116061186f565b9361122d575b6040518095819263519f184360e11b83523060048401611ab2565b038160006108055af1918215610201576000926111f2575b602093506111ac57506040519015158152f35b6000808080600f6106809582546111c58160070b611b02565b6001600160401b031667ffffffffffffffff19919091161783556001600160a01b03165af16101b4611b1a565b91506020833d8211611225575b8161120c602093836117cf565b810103126101f45761121f602093611aa5565b91611199565b3d91506111ff565b60005461123c8160070b611b02565b6001600160401b0316906001600160401b031916176000556112716000808080600f60018060a01b0389165af16101b4611b1a565b611166565b60803660031901126101f45761128a611713565b611292611729565b9060448035916001600160401b03928381116101f4576112b6903690600401611755565b93909160649485358381116101f4576112d3903690600401611842565b9160018060a01b0316926000546112ec8160070b611b02565b82166001600160401b03198092161760005560008080806001895af1611310611b1a565b50156116c65761133a97986040519063519f184360e11b8252818060209b8c933060048401611ab2565b038160006108055af16000918161168f575b5061142b5789898961135c611c98565b6308c379a0146113a7575b7f63616e63656c50726f706f73616c206661696c65642073696c656e746c790000906040519262461bcd60e51b84526004840152601e6024840152820152fd5b6113af611cb6565b806113ba5750611367565b826114066037604051809476031b0b731b2b6283937b837b9b0b6103330b4b632b21d1604d1b858301526113f68151809287868601910161188d565b81010360178101855201836117cf565b61142760405192839262461bcd60e51b8452600484015260248301906118b0565b0390fd5b1561164c5790879492959391600054916114478360070b611b02565b169116176000556040519261145b84611782565b6001845260005b85811061161c5750946114866114c1966040519261147f84611782565b369161180b565b815260028582015261149784611d24565b526114a183611d24565b506000604051809681958294635ca64c1160e11b84528660048501611d47565b03925af1600091816115e5575b5061159757506114dc611c98565b6308c379a014611532575b6084927f66756e64436f6d6d756e697479506f6f6c206661696c65642073696c656e746c607960f81b926040519462461bcd60e51b8652600486015260216024860152840152820152fd5b61153a611cb6565b8061154557506114e7565b82611406603a60405180947f66756e64436f6d6d756e697479506f6f6c206661696c65643a20000000000000858301526115878151809287868601910161188d565b810103601a8101855201836117cf565b156115a6575060405160018152f35b7f66756e64436f6d6d756e697479506f6f6c2072657475726e65642066616c7365906040519262461bcd60e51b84528060048501526024840152820152fd5b9091508381813d8311611615575b6115fd81836117cf565b810103126101f45761160e90611aa5565b90856114ce565b503d6115f3565b6040969395919294965161162f81611782565b606081526000838201528282890101520190879492959391611462565b60405162461bcd60e51b815260048101899052601d60248201527f63616e63656c50726f706f73616c2072657475726e65642066616c7365000000818901528990fd5b9091508981813d83116116bf575b6116a781836117cf565b810103126101f4576116b890611aa5565b908b61134c565b503d61169d565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f206465706f7369746f81890152603960f91b818a0152608490fd5b600435906001600160a01b03821682036101f457565b602435906001600160401b03821682036101f457565b600435906001600160401b03821682036101f457565b9181601f840112156101f4578235916001600160401b0383116101f457602083818601950101116101f457565b604081019081106001600160401b0382111761179d57604052565b634e487b7160e01b600052604160045260246000fd5b61020081019081106001600160401b0382111761179d57604052565b90601f801991011681019081106001600160401b0382111761179d57604052565b6001600160401b03811161179d57601f01601f191660200190565b929192611817826117f0565b9161182560405193846117cf565b8294818452818301116101f4578281602093846000960137010152565b9080601f830112156101f45781602061185d9335910161180b565b90565b6044359081151582036101f457565b6064359081151582036101f457565b6084359081151582036101f457565b60005b8381106118a05750506000910152565b8181015183820152602001611890565b906020916118c98151809281855285808601910161188d565b601f01601f1916010190565b908082519081815260208091019281808460051b8301019501936000915b8483106119035750505050505090565b9091929394958480600192601f19858203018652895190828061192e845160408086528501906118b0565b93015191015298019301930191949392906118f3565b9181601f840112156101f4578235916001600160401b0383116101f4576020808501948460051b0101116101f457565b6001600160401b03811161179d5760051b60200190565b908160209103126101f457516001600160401b03811681036101f45790565b908060209392818452848401376000828201840152601f01601f1916010190565b9080835260208093019081938160051b830194846000915b8483106119f4575050505050505090565b9091929394959681810387528735603e19843603018112156101f45783018035601e19823603018112156101f4578101908682359201906001600160401b0383116101f45782360382136101f4576001938880611a5c819695829660408087528601916119aa565b930135910152990197019594930191906119e3565b939161185d9593611a979260018060a01b031686526060602087015260608601916119aa565b9260408185039101526119cb565b519081151582036101f457565b6001600160a01b0390911681526001600160401b03909116602082015260400190565b6001600160401b0361185d959360609360018060a01b0316835216602082015281604082015201916119cb565b60070b677fffffffffffffff81146105335760010190565b3d15611b45573d90611b2b826117f0565b91611b3960405193846117cf565b82523d6000602084013e565b606090565b15611b5157565b606460405162461bcd60e51b815260206004820152602060248201527f4661696c656420746f2073656e6420457468657220746f2070726f706f7365726044820152fd5b51908160070b82036101f457565b81601f820112156101f4578051611bb9816117f0565b92611bc760405194856117cf565b818452602082840101116101f45761185d916020808501910161188d565b81601f820112156101f4578051611bfb81611974565b92604091611c0b835195866117cf565b808552602093848087019260051b820101938385116101f457858201925b858410611c3a575050505050505090565b8351906001600160401b03918281116101f45784019083601f1983890301126101f4578351611c6881611782565b898301519384116101f4578483611c858a8d809881980101611ba3565b8352015183820152815201930192611c29565b60009060033d11611ca557565b905060046000803e60005160e01c90565b600060443d1061185d57604051600319913d83016004833e81516001600160401b03918282113d602484011117611d1357818401948551938411611d1b573d85010160208487010111611d13575061185d929101602001906117cf565b949350505050565b50949350505050565b805115611d315760200190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909116815260606020820181905261185d939192611d6f918401906118b0565b9160408184039101526118d556fea2646970667358221220c9625558987b92b3d3d39d698b4548091cb23adaf68209787374d331e395f0ec64736f6c63430008140033", + "bytecode": "0x60808060405234601557611c86908161001a8239f35b5f80fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80630f6265fb146110e9578063258691e214610fcc57806326c11ffa14610f3f5780635e615a6b14610b0f57806361bc221a14610af057806361f09ad214610a8057806372ff5ec4146109315780637726ece0146107f55780638e7431d31461077557806391d6d8e71461062557806397fd84d2146105f1578063b94c9822146103db578063bc7bdf751461032a578063d0e30db01461031d578063e8702c34146102505763ed6c08f70361000e5760a03660031901126101f3576100e26115be565b6100ea6115d4565b604435916001600160401b0383116101f35761010c60209336906004016117b1565b9390610116611703565b9361011f611712565b9461020a575b610144604051968793849363592581bb60e11b85523060048601611c23565b03815f6108055af19182156101ff575f926101bf575b6020935061016e575b506040519015158152f35b5f808080600f6101b99582546101868160070b6117f8565b6001600160401b031667ffffffffffffffff19919091161783556001600160a01b03165af16101b3611810565b506119b0565b5f610163565b91506020833d6020116101f7575b816101da60209383611664565b810103126101f3576101ed60209361183f565b9161015a565b5f80fd5b3d91506101cd565b6040513d5f823e3d90fd5b5f546102188160070b6117f8565b6001600160401b0316906001600160401b031916175f5561024b5f808080600f60018060a01b038a165af16101b3611810565b610125565b60603660031901126101f3576102646115be565b6024356001600160401b0381116101f357610283903690600401611600565b9190604435916001600160401b0383116101f3576102c66102aa60209436906004016117b1565b90604051968795869563a8fdc91960e01b875260048701611bef565b03815f6108055af180156101ff576020915f916102f0575b506001600160401b0360405191168152f35b6103109150823d8411610316575b6103088183611664565b810190611b08565b826102de565b503d6102fe565b5f3660031901126101f357005b60403660031901126101f35761033e6115ea565b6024356001600160401b0381116101f35761035f60209136906004016117b1565b9261037f604051948593849363592581bb60e11b85523060048601611c23565b03815f6108055af180156101ff575f906103a1575b6020906040519015158152f35b506020813d6020116103d3575b816103bb60209383611664565b810103126101f3576103ce60209161183f565b610394565b3d91506103ae565b346101f35760603660031901126101f3576103f46115be565b6024356001600160401b0381116101f3576104139036906004016116d6565b90604435916001600160401b0383116101f357366023840112156101f357826004013561043f816117e1565b9361044d6040519586611664565b8185526024602086019260051b820101903682116101f35760248101925b82841061058657505050505f549160018360070b0192677fffffffffffffff198412677fffffffffffffff851317610538576020936001600160401b0316906001600160401b031916175f556104d56040519485938493631758efa960e11b85526004850161191d565b03815f6108015af19081156101ff575f9161054c575b505f54600781900b5f19019190677fffffffffffffff198312677fffffffffffffff841317610538576020926001600160401b0316906001600160401b031916175f556040519015158152f35b634e487b7160e01b5f52601160045260245ffd5b90506020813d60201161057e575b8161056760209383611664565b810103126101f3576105789061183f565b816104eb565b3d915061055a565b83356001600160401b0381116101f3578201604060231982360301126101f357604051916105b38361162d565b6024820135926001600160401b0384116101f3576044602094936105de8695602436918401016116d6565b835201358382015281520193019261046b565b60203660031901126101f35761037f602061060a6115ea565b6040518093819263519f184360e11b8352306004840161184c565b60803660031901126101f3576004356001600160401b0381116101f357610650903690600401611600565b6024356001600160401b0381116101f35761067160209136906004016117b1565b9290936106aa61067f6116f4565b94610688611703565b95610737575b60405163a8fdc91960e01b815296879485943060048701611bef565b03815f6108055af19081156101ff576020925f92610718575b506106da575b6001600160401b0360405191168152f35b5f546106e88160070b6117f8565b6001600160401b0316906001600160401b031916175f556107135f808080600f335af16101b3611810565b6106c9565b610730919250833d8511610316576103088183611664565b90836106c3565b5f546107458160070b6117f8565b6001600160401b0316906001600160401b031916175f556107705f808080600f335af16101b3611810565b61068e565b60603660031901126101f3576107896115be565b6107916115d4565b604435906001600160401b0382116101f3576001600160401b039261037f6107bf60209436906004016117b1565b604051968795869563592581bb60e11b875260018060a01b03166004870152166024850152606060448501526064840191611b47565b60a03660031901126101f3576108096115be565b6024356001600160401b0381116101f357610828903690600401611600565b90916044356001600160401b0381116101f35761084b60209136906004016117b1565b939094610884610859611703565b95610862611712565b966108eb575b60405163a8fdc91960e01b815297889485943060048701611bef565b03815f6108055af19182156101ff576020935f936108cc575b506108b457506001600160401b0360405191168152f35b5f808080600f6103109582546101868160070b6117f8565b6108e4919350843d8611610316576103088183611664565b918461089d565b5f546108f98160070b6117f8565b6001600160401b0316906001600160401b031916175f5561092c5f808080600f60018060a01b038c165af16101b3611810565b610868565b60803660031901126101f3576109456115ea565b602435906001600160401b0382116101f35761096760209236906004016117b1565b92906109716116f4565b9261097a611703565b93610a42575b61099f604051958693849363592581bb60e11b85523060048601611c23565b03815f6108055af19081156101ff575f91610a06575b602092506109c8575b6040519015158152f35b5f546109d68160070b6117f8565b6001600160401b0316906001600160401b031916175f55610a015f808080600f335af16101b3611810565b6109be565b90506020823d602011610a3a575b81610a2160209383611664565b810103126101f357610a3460209261183f565b906109b5565b3d9150610a14565b5f54610a508160070b6117f8565b6001600160401b0316906001600160401b031916175f55610a7b5f808080600f335af16101b3611810565b610980565b60403660031901126101f3576004356001600160401b0381116101f357610aab903690600401611600565b602435906001600160401b0382116101f3576102c692610ad160209336906004016117b1565b60405163a8fdc91960e01b815295869485949193913060048701611bef565b346101f3575f3660031901126101f35760205f5460070b604051908152f35b346101f3575f3660031901126101f35760606101e0604051610b3081611648565b5f81528260208201525f604082015282808201528260808201528260a08201528260c08201528260e0820152826101008201525f61012082015282610140820152826101608201525f6101808201525f6101a08201525f6101c08201520152604051635e615a6b60e01b81525f816004816108055afa80156101ff575f90610d18575b610d149060405191829160208352805160070b60208401526101e0610cd7610cbf610c98610c80610c69610c53610c3d610c27610c028c61022060208d01519161020060408201520190611745565b8c606060408d015160070b91015260608b01518d6080601f1982850301910152611721565b60808a01518c8203601f190160a08e0152611721565b60a08901518b8203601f190160c08d0152611721565b60c08801518a8203601f190160e08c0152611721565b60e0870151898203601f19016101008b0152611721565b610100860151888203601f19016101208a0152611721565b61012085015160070b610140880152610140850151601f1988830301610160890152611721565b610160840151868203601f1901610180880152611745565b9161018081015115156101a08601526101a081015115156101c08601526101c08101511515828601520151601f1984830301610200850152611721565b0390f35b503d805f833e610d288183611664565b8101906020818303126101f3578051906001600160401b0382116101f35701610200818303126101f35760405190610d5f82611648565b610d68816119fb565b825260208101516001600160401b0381116101f35783610d89918301611a4f565b6020830152610d9a604082016119fb565b604083015260608101516001600160401b0381116101f35783610dbe918301611a09565b606083015260808101516001600160401b0381116101f35783610de2918301611a09565b608083015260a08101516001600160401b0381116101f35783610e06918301611a09565b60a083015260c08101516001600160401b0381116101f35783610e2a918301611a09565b60c083015260e08101516001600160401b0381116101f35783610e4e918301611a09565b60e08301526101008101516001600160401b0381116101f35783610e73918301611a09565b610100830152610e8661012082016119fb565b6101208301526101408101516001600160401b0381116101f35783610eac918301611a09565b6101408301526101608101516001600160401b0381116101f35783610ed2918301611a4f565b610160830152610ee5610180820161183f565b610180830152610ef86101a0820161183f565b6101a0830152610f0b6101c0820161183f565b6101c08301526101e0810151926001600160401b0384116101f357610d1493610f349201611a09565b6101e0820152610bb3565b60603660031901126101f357610f536115ea565b60243580151581036101f357602061099f92610f6d6116f4565b92610f8e575b6040518094819263519f184360e11b8352306004840161184c565b5f54610f9c8160070b6117f8565b6001600160401b0316906001600160401b031916175f55610fc75f808080600f335af16101b3611810565b610f73565b60803660031901126101f357611020610fe36115be565b610feb6115d4565b906020610ff66116f4565b92610fff611703565b936110a3575b6040518095819263519f184360e11b8352306004840161184c565b03815f6108055af19182156101ff575f92611067575b6020935061104957506040519015158152f35b5f808080600f6110619582546101868160070b6117f8565b82610163565b91506020833d60201161109b575b8161108260209383611664565b810103126101f35761109560209361183f565b91611036565b3d9150611075565b5f546110b18160070b6117f8565b6001600160401b0316906001600160401b031916175f556110e45f808080600f60018060a01b0389165af16101b3611810565b611005565b60803660031901126101f3576110fd6115be565b6111056115d4565b6044356001600160401b0381116101f357611124903690600401611600565b6064939193356001600160401b0381116101f3576111469036906004016116d6565b9160018060a01b0316925f5461115e8160070b6117f8565b6001600160401b0316906001600160401b031916175f555f8080806001885af1611186611810565b501561156f5760206111ad916040518093819263519f184360e11b8352306004840161184c565b03815f6108055af15f9181611533575b506112a1576111ca61186f565b6308c379a01461121a575b60405162461bcd60e51b815260206004820152601e60248201527f63616e63656c50726f706f73616c206661696c65642073696c656e746c7900006044820152606490fd5b61122261188a565b8061122d57506111d5565b602061127d603761129d9360405193849176031b0b731b2b6283937b837b9b0b6103330b4b632b21d1604d1b828401528051918291018484015e81015f838201520301601f198101835282611664565b60405162461bcd60e51b8152602060048201529182916024830190611721565b0390fd5b156114ee575f546112b48160070b6117f8565b6001600160401b031667ffffffffffffffff1991909116175f556040805194906112de8187611664565b60018652601f19015f5b8181106114b65761134a60208888888861131089604051926113098461162d565b36916116a0565b8152600285820152611321846118fc565b5261132b836118fc565b505f604051809681958294635ca64c1160e11b8452866004850161191d565b03925af15f918161147a575b506114265761136361186f565b6308c379a0146113bd575b60405162461bcd60e51b815260206004820152602160248201527f66756e64436f6d6d756e697479506f6f6c206661696c65642073696c656e746c6044820152607960f81b6064820152608490fd5b6113c561188a565b806113d0575061136e565b602061127d603a61129d936040519384917f66756e64436f6d6d756e697479506f6f6c206661696c65643a20000000000000828401528051918291018484015e81015f838201520301601f198101835282611664565b1561143657602060405160018152f35b606460405162461bcd60e51b815260206004820152602060248201527f66756e64436f6d6d756e697479506f6f6c2072657475726e65642066616c73656044820152fd5b9091506020813d6020116114ae575b8161149660209383611664565b810103126101f3576114a79061183f565b9082611356565b3d9150611489565b6020906040516114c58161162d565b606081525f8382015282828a010152016112e8565b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152601d60248201527f63616e63656c50726f706f73616c2072657475726e65642066616c73650000006044820152606490fd5b9091506020813d602011611567575b8161154f60209383611664565b810103126101f3576115609061183f565b90866111bd565b3d9150611542565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f206465706f7369746f6044820152603960f91b6064820152608490fd5b600435906001600160a01b03821682036101f357565b602435906001600160401b03821682036101f357565b600435906001600160401b03821682036101f357565b9181601f840112156101f3578235916001600160401b0383116101f357602083818601950101116101f357565b604081019081106001600160401b038211176114da57604052565b61020081019081106001600160401b038211176114da57604052565b90601f801991011681019081106001600160401b038211176114da57604052565b6001600160401b0381116114da57601f01601f191660200190565b9291926116ac82611685565b916116ba6040519384611664565b8294818452818301116101f3578281602093845f960137010152565b9080601f830112156101f3578160206116f1933591016116a0565b90565b6044359081151582036101f357565b6064359081151582036101f357565b6084359081151582036101f357565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9080602083519182815201916020808360051b8301019401925f915b83831061177057505050505090565b9091929394602080600192601f19858203018652885190828061179c8451604085526040850190611721565b93015191015297019301930191939290611761565b9181601f840112156101f3578235916001600160401b0383116101f3576020808501948460051b0101116101f357565b6001600160401b0381116114da5760051b60200190565b60070b677fffffffffffffff81146105385760010190565b3d1561183a573d9061182182611685565b9161182f6040519384611664565b82523d5f602084013e565b606090565b519081151582036101f357565b6001600160a01b0390911681526001600160401b03909116602082015260400190565b5f9060033d1161187b57565b905060045f803e5f5160e01c90565b5f60443d106116f1576040513d600319016004823e8051913d60248401116001600160401b038411176118f657828201928351916001600160401b0383116118ee573d840160031901858401602001116118ee57506116f192910160200190611664565b949350505050565b92915050565b8051156119095760200190565b634e487b7160e01b5f52603260045260245ffd5b9161193d9160018060a01b03168352606060208401526060830190611721565b906040818303910152815180825260208201916020808360051b8301019401925f915b83831061196f57505050505090565b9091929394602080600192601f19858203018652885190828061199b8451604085526040850190611721565b93015191015297019301930191939290611960565b156119b757565b606460405162461bcd60e51b815260206004820152602060248201527f4661696c656420746f2073656e6420457468657220746f2070726f706f7365726044820152fd5b51908160070b82036101f357565b81601f820112156101f357805190611a2082611685565b92611a2e6040519485611664565b828452602083830101116101f357815f9260208093018386015e8301015290565b81601f820112156101f357805190611a66826117e1565b92611a746040519485611664565b82845260208085019360051b830101918183116101f35760208101935b838510611aa057505050505090565b84516001600160401b0381116101f35782016040818503601f1901126101f35760405191611acd8361162d565b6020820151926001600160401b0384116101f357604083611af5886020809881980101611a09565b8352015183820152815201940193611a91565b908160209103126101f357516001600160401b03811681036101f35790565b908060209392818452848401375f828201840152601f01601f1916010190565b906020838281520160208260051b85010193835f915b848310611b6d5750505050505090565b909192939495601f198282030185528635603e19843603018112156101f35783018035601e19823603018112156101f357810190602082359201906001600160401b0383116101f35782360382136101f35783602080611bdb8196958296604060019a526040860191611b27565b930135910152980196950193019190611b5d565b93916116f19593611c159260018060a01b03168652606060208701526060860191611b27565b926040818503910152611b47565b6001600160401b036116f1959360609360018060a01b031683521660208201528160408201520191611b4756fea2646970667358221220c22795ac459a81ce4840d12681ee73b1b80f7d812e22ed103c1b6d8b51026a8a64736f6c634300081a0033", + "deployedBytecode": "0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80630f6265fb146110e9578063258691e214610fcc57806326c11ffa14610f3f5780635e615a6b14610b0f57806361bc221a14610af057806361f09ad214610a8057806372ff5ec4146109315780637726ece0146107f55780638e7431d31461077557806391d6d8e71461062557806397fd84d2146105f1578063b94c9822146103db578063bc7bdf751461032a578063d0e30db01461031d578063e8702c34146102505763ed6c08f70361000e5760a03660031901126101f3576100e26115be565b6100ea6115d4565b604435916001600160401b0383116101f35761010c60209336906004016117b1565b9390610116611703565b9361011f611712565b9461020a575b610144604051968793849363592581bb60e11b85523060048601611c23565b03815f6108055af19182156101ff575f926101bf575b6020935061016e575b506040519015158152f35b5f808080600f6101b99582546101868160070b6117f8565b6001600160401b031667ffffffffffffffff19919091161783556001600160a01b03165af16101b3611810565b506119b0565b5f610163565b91506020833d6020116101f7575b816101da60209383611664565b810103126101f3576101ed60209361183f565b9161015a565b5f80fd5b3d91506101cd565b6040513d5f823e3d90fd5b5f546102188160070b6117f8565b6001600160401b0316906001600160401b031916175f5561024b5f808080600f60018060a01b038a165af16101b3611810565b610125565b60603660031901126101f3576102646115be565b6024356001600160401b0381116101f357610283903690600401611600565b9190604435916001600160401b0383116101f3576102c66102aa60209436906004016117b1565b90604051968795869563a8fdc91960e01b875260048701611bef565b03815f6108055af180156101ff576020915f916102f0575b506001600160401b0360405191168152f35b6103109150823d8411610316575b6103088183611664565b810190611b08565b826102de565b503d6102fe565b5f3660031901126101f357005b60403660031901126101f35761033e6115ea565b6024356001600160401b0381116101f35761035f60209136906004016117b1565b9261037f604051948593849363592581bb60e11b85523060048601611c23565b03815f6108055af180156101ff575f906103a1575b6020906040519015158152f35b506020813d6020116103d3575b816103bb60209383611664565b810103126101f3576103ce60209161183f565b610394565b3d91506103ae565b346101f35760603660031901126101f3576103f46115be565b6024356001600160401b0381116101f3576104139036906004016116d6565b90604435916001600160401b0383116101f357366023840112156101f357826004013561043f816117e1565b9361044d6040519586611664565b8185526024602086019260051b820101903682116101f35760248101925b82841061058657505050505f549160018360070b0192677fffffffffffffff198412677fffffffffffffff851317610538576020936001600160401b0316906001600160401b031916175f556104d56040519485938493631758efa960e11b85526004850161191d565b03815f6108015af19081156101ff575f9161054c575b505f54600781900b5f19019190677fffffffffffffff198312677fffffffffffffff841317610538576020926001600160401b0316906001600160401b031916175f556040519015158152f35b634e487b7160e01b5f52601160045260245ffd5b90506020813d60201161057e575b8161056760209383611664565b810103126101f3576105789061183f565b816104eb565b3d915061055a565b83356001600160401b0381116101f3578201604060231982360301126101f357604051916105b38361162d565b6024820135926001600160401b0384116101f3576044602094936105de8695602436918401016116d6565b835201358382015281520193019261046b565b60203660031901126101f35761037f602061060a6115ea565b6040518093819263519f184360e11b8352306004840161184c565b60803660031901126101f3576004356001600160401b0381116101f357610650903690600401611600565b6024356001600160401b0381116101f35761067160209136906004016117b1565b9290936106aa61067f6116f4565b94610688611703565b95610737575b60405163a8fdc91960e01b815296879485943060048701611bef565b03815f6108055af19081156101ff576020925f92610718575b506106da575b6001600160401b0360405191168152f35b5f546106e88160070b6117f8565b6001600160401b0316906001600160401b031916175f556107135f808080600f335af16101b3611810565b6106c9565b610730919250833d8511610316576103088183611664565b90836106c3565b5f546107458160070b6117f8565b6001600160401b0316906001600160401b031916175f556107705f808080600f335af16101b3611810565b61068e565b60603660031901126101f3576107896115be565b6107916115d4565b604435906001600160401b0382116101f3576001600160401b039261037f6107bf60209436906004016117b1565b604051968795869563592581bb60e11b875260018060a01b03166004870152166024850152606060448501526064840191611b47565b60a03660031901126101f3576108096115be565b6024356001600160401b0381116101f357610828903690600401611600565b90916044356001600160401b0381116101f35761084b60209136906004016117b1565b939094610884610859611703565b95610862611712565b966108eb575b60405163a8fdc91960e01b815297889485943060048701611bef565b03815f6108055af19182156101ff576020935f936108cc575b506108b457506001600160401b0360405191168152f35b5f808080600f6103109582546101868160070b6117f8565b6108e4919350843d8611610316576103088183611664565b918461089d565b5f546108f98160070b6117f8565b6001600160401b0316906001600160401b031916175f5561092c5f808080600f60018060a01b038c165af16101b3611810565b610868565b60803660031901126101f3576109456115ea565b602435906001600160401b0382116101f35761096760209236906004016117b1565b92906109716116f4565b9261097a611703565b93610a42575b61099f604051958693849363592581bb60e11b85523060048601611c23565b03815f6108055af19081156101ff575f91610a06575b602092506109c8575b6040519015158152f35b5f546109d68160070b6117f8565b6001600160401b0316906001600160401b031916175f55610a015f808080600f335af16101b3611810565b6109be565b90506020823d602011610a3a575b81610a2160209383611664565b810103126101f357610a3460209261183f565b906109b5565b3d9150610a14565b5f54610a508160070b6117f8565b6001600160401b0316906001600160401b031916175f55610a7b5f808080600f335af16101b3611810565b610980565b60403660031901126101f3576004356001600160401b0381116101f357610aab903690600401611600565b602435906001600160401b0382116101f3576102c692610ad160209336906004016117b1565b60405163a8fdc91960e01b815295869485949193913060048701611bef565b346101f3575f3660031901126101f35760205f5460070b604051908152f35b346101f3575f3660031901126101f35760606101e0604051610b3081611648565b5f81528260208201525f604082015282808201528260808201528260a08201528260c08201528260e0820152826101008201525f61012082015282610140820152826101608201525f6101808201525f6101a08201525f6101c08201520152604051635e615a6b60e01b81525f816004816108055afa80156101ff575f90610d18575b610d149060405191829160208352805160070b60208401526101e0610cd7610cbf610c98610c80610c69610c53610c3d610c27610c028c61022060208d01519161020060408201520190611745565b8c606060408d015160070b91015260608b01518d6080601f1982850301910152611721565b60808a01518c8203601f190160a08e0152611721565b60a08901518b8203601f190160c08d0152611721565b60c08801518a8203601f190160e08c0152611721565b60e0870151898203601f19016101008b0152611721565b610100860151888203601f19016101208a0152611721565b61012085015160070b610140880152610140850151601f1988830301610160890152611721565b610160840151868203601f1901610180880152611745565b9161018081015115156101a08601526101a081015115156101c08601526101c08101511515828601520151601f1984830301610200850152611721565b0390f35b503d805f833e610d288183611664565b8101906020818303126101f3578051906001600160401b0382116101f35701610200818303126101f35760405190610d5f82611648565b610d68816119fb565b825260208101516001600160401b0381116101f35783610d89918301611a4f565b6020830152610d9a604082016119fb565b604083015260608101516001600160401b0381116101f35783610dbe918301611a09565b606083015260808101516001600160401b0381116101f35783610de2918301611a09565b608083015260a08101516001600160401b0381116101f35783610e06918301611a09565b60a083015260c08101516001600160401b0381116101f35783610e2a918301611a09565b60c083015260e08101516001600160401b0381116101f35783610e4e918301611a09565b60e08301526101008101516001600160401b0381116101f35783610e73918301611a09565b610100830152610e8661012082016119fb565b6101208301526101408101516001600160401b0381116101f35783610eac918301611a09565b6101408301526101608101516001600160401b0381116101f35783610ed2918301611a4f565b610160830152610ee5610180820161183f565b610180830152610ef86101a0820161183f565b6101a0830152610f0b6101c0820161183f565b6101c08301526101e0810151926001600160401b0384116101f357610d1493610f349201611a09565b6101e0820152610bb3565b60603660031901126101f357610f536115ea565b60243580151581036101f357602061099f92610f6d6116f4565b92610f8e575b6040518094819263519f184360e11b8352306004840161184c565b5f54610f9c8160070b6117f8565b6001600160401b0316906001600160401b031916175f55610fc75f808080600f335af16101b3611810565b610f73565b60803660031901126101f357611020610fe36115be565b610feb6115d4565b906020610ff66116f4565b92610fff611703565b936110a3575b6040518095819263519f184360e11b8352306004840161184c565b03815f6108055af19182156101ff575f92611067575b6020935061104957506040519015158152f35b5f808080600f6110619582546101868160070b6117f8565b82610163565b91506020833d60201161109b575b8161108260209383611664565b810103126101f35761109560209361183f565b91611036565b3d9150611075565b5f546110b18160070b6117f8565b6001600160401b0316906001600160401b031916175f556110e45f808080600f60018060a01b0389165af16101b3611810565b611005565b60803660031901126101f3576110fd6115be565b6111056115d4565b6044356001600160401b0381116101f357611124903690600401611600565b6064939193356001600160401b0381116101f3576111469036906004016116d6565b9160018060a01b0316925f5461115e8160070b6117f8565b6001600160401b0316906001600160401b031916175f555f8080806001885af1611186611810565b501561156f5760206111ad916040518093819263519f184360e11b8352306004840161184c565b03815f6108055af15f9181611533575b506112a1576111ca61186f565b6308c379a01461121a575b60405162461bcd60e51b815260206004820152601e60248201527f63616e63656c50726f706f73616c206661696c65642073696c656e746c7900006044820152606490fd5b61122261188a565b8061122d57506111d5565b602061127d603761129d9360405193849176031b0b731b2b6283937b837b9b0b6103330b4b632b21d1604d1b828401528051918291018484015e81015f838201520301601f198101835282611664565b60405162461bcd60e51b8152602060048201529182916024830190611721565b0390fd5b156114ee575f546112b48160070b6117f8565b6001600160401b031667ffffffffffffffff1991909116175f556040805194906112de8187611664565b60018652601f19015f5b8181106114b65761134a60208888888861131089604051926113098461162d565b36916116a0565b8152600285820152611321846118fc565b5261132b836118fc565b505f604051809681958294635ca64c1160e11b8452866004850161191d565b03925af15f918161147a575b506114265761136361186f565b6308c379a0146113bd575b60405162461bcd60e51b815260206004820152602160248201527f66756e64436f6d6d756e697479506f6f6c206661696c65642073696c656e746c6044820152607960f81b6064820152608490fd5b6113c561188a565b806113d0575061136e565b602061127d603a61129d936040519384917f66756e64436f6d6d756e697479506f6f6c206661696c65643a20000000000000828401528051918291018484015e81015f838201520301601f198101835282611664565b1561143657602060405160018152f35b606460405162461bcd60e51b815260206004820152602060248201527f66756e64436f6d6d756e697479506f6f6c2072657475726e65642066616c73656044820152fd5b9091506020813d6020116114ae575b8161149660209383611664565b810103126101f3576114a79061183f565b9082611356565b3d9150611489565b6020906040516114c58161162d565b606081525f8382015282828a010152016112e8565b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152601d60248201527f63616e63656c50726f706f73616c2072657475726e65642066616c73650000006044820152606490fd5b9091506020813d602011611567575b8161154f60209383611664565b810103126101f3576115609061183f565b90866111bd565b3d9150611542565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f206465706f7369746f6044820152603960f91b6064820152608490fd5b600435906001600160a01b03821682036101f357565b602435906001600160401b03821682036101f357565b600435906001600160401b03821682036101f357565b9181601f840112156101f3578235916001600160401b0383116101f357602083818601950101116101f357565b604081019081106001600160401b038211176114da57604052565b61020081019081106001600160401b038211176114da57604052565b90601f801991011681019081106001600160401b038211176114da57604052565b6001600160401b0381116114da57601f01601f191660200190565b9291926116ac82611685565b916116ba6040519384611664565b8294818452818301116101f3578281602093845f960137010152565b9080601f830112156101f3578160206116f1933591016116a0565b90565b6044359081151582036101f357565b6064359081151582036101f357565b6084359081151582036101f357565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9080602083519182815201916020808360051b8301019401925f915b83831061177057505050505090565b9091929394602080600192601f19858203018652885190828061179c8451604085526040850190611721565b93015191015297019301930191939290611761565b9181601f840112156101f3578235916001600160401b0383116101f3576020808501948460051b0101116101f357565b6001600160401b0381116114da5760051b60200190565b60070b677fffffffffffffff81146105385760010190565b3d1561183a573d9061182182611685565b9161182f6040519384611664565b82523d5f602084013e565b606090565b519081151582036101f357565b6001600160a01b0390911681526001600160401b03909116602082015260400190565b5f9060033d1161187b57565b905060045f803e5f5160e01c90565b5f60443d106116f1576040513d600319016004823e8051913d60248401116001600160401b038411176118f657828201928351916001600160401b0383116118ee573d840160031901858401602001116118ee57506116f192910160200190611664565b949350505050565b92915050565b8051156119095760200190565b634e487b7160e01b5f52603260045260245ffd5b9161193d9160018060a01b03168352606060208401526060830190611721565b906040818303910152815180825260208201916020808360051b8301019401925f915b83831061196f57505050505090565b9091929394602080600192601f19858203018652885190828061199b8451604085526040850190611721565b93015191015297019301930191939290611960565b156119b757565b606460405162461bcd60e51b815260206004820152602060248201527f4661696c656420746f2073656e6420457468657220746f2070726f706f7365726044820152fd5b51908160070b82036101f357565b81601f820112156101f357805190611a2082611685565b92611a2e6040519485611664565b828452602083830101116101f357815f9260208093018386015e8301015290565b81601f820112156101f357805190611a66826117e1565b92611a746040519485611664565b82845260208085019360051b830101918183116101f35760208101935b838510611aa057505050505090565b84516001600160401b0381116101f35782016040818503601f1901126101f35760405191611acd8361162d565b6020820151926001600160401b0384116101f357604083611af5886020809881980101611a09565b8352015183820152815201940193611a91565b908160209103126101f357516001600160401b03811681036101f35790565b908060209392818452848401375f828201840152601f01601f1916010190565b906020838281520160208260051b85010193835f915b848310611b6d5750505050505090565b909192939495601f198282030185528635603e19843603018112156101f35783018035601e19823603018112156101f357810190602082359201906001600160401b0383116101f35782360382136101f35783602080611bdb8196958296604060019a526040860191611b27565b930135910152980196950193019190611b5d565b93916116f19593611c159260018060a01b03168652606060208701526060860191611b27565b926040818503910152611b47565b6001600160401b036116f1959360609360018060a01b031683521660208201528160408201520191611b4756fea2646970667358221220c22795ac459a81ce4840d12681ee73b1b80f7d812e22ed103c1b6d8b51026a8a64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/testutil/contracts/GovCaller.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/testutil/contracts/ICS20Caller.json b/precompiles/testutil/contracts/ICS20Caller.json index 71a2210d5..a87a120ec 100644 --- a/precompiles/testutil/contracts/ICS20Caller.json +++ b/precompiles/testutil/contracts/ICS20Caller.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "ICS20Caller", "sourceName": "solidity/precompiles/testutil/contracts/ICS20Caller.sol", "abi": [ @@ -388,8 +388,11 @@ "type": "function" } ], - "bytecode": "0x6080806040523461001657610a61908161001c8239f35b600080fdfe608060408181526004908136101561001657600080fd5b600092833560e01c90816361bc221a146106a357508063b42bc5a9146104bf578063bcc45b7914610372578063c352645014610179578063d0e30db014610167578063d8bb6c0e146100f85763e12e9b271461007157600080fd5b346100f45760206100a86100843661079f565b8b5163632535b960e01b81529c8d9a8b9a9099929893979496949392918b016108e7565b0381866108025af19081156100eb57506100c0575080fd5b6100e09060203d81116100e4575b6100d881836106f1565b810190610888565b5080fd5b503d6100ce565b513d84823e3d90fd5b8280fd5b50346100f457602061010c6100843661079f565b0381866108025af191821561015d5760209392610135575b506001600160401b03905191168152f35b6001600160401b0391925061015690843d81116100e4576100d881836106f1565b9190610124565b81513d85823e3d90fd5b83806003193601126101765780f35b80fd5b50346100f4576101803660031901126100f4576001600160401b0390823582811161036e576101ab903690850161072d565b936024358381116100e0576101c3903690860161072d565b6044358481116100f4576101da903690870161072d565b956101e3610779565b60a43586811161036e576101fa903690890161072d565b8560c31936011261036e578551610210816106c0565b60c435888116810361036a57815260e435888116810361036a5760208201526101043591888316830361036a5761012435898111610366576102559036908c0161072d565b93610144359a8b15158c0361036257916020979695939161029b959361027961078f565b9d61032b575b8b5163632535b960e01b81529e8f998a99606435938b016108e7565b0381846108025af193841561031f576020958295610300575b506102c2575b505191168152f35b806102fa91546102d48160070b610981565b8516906001600160401b031916178155808080600f335af16102f46109af565b506109df565b386102ba565b610318919550863d81116100e4576100d881836106f1565b93386102b4565b509051903d90823e3d90fd5b8a548d61033a8260070b610981565b16906001600160401b031916178b5561035d8b808080600f335af16102f46109af565b61027f565b8880fd5b8780fd5b8680fd5b8480fd5b50346100f4576101203660031901126100f4576001600160401b0390823582811161036e576103a4903690850161072d565b6024358381116104bb576103bb903690860161072d565b60443584811161036a576103d2903690870161072d565b90608435858111610366576103ea903690880161072d565b928460a31936011261036657845190610402826106c0565b60a43587811681036104b757825260c43587811681036104b757602083015260e43587811681036104b75761010435928884116104b35760209661044c61046b9536908d0161072d565b9389519b8c98899863632535b960e01b8a523093606435938b016108e7565b0381876108025af19283156104a9576020949361048a57505191168152f35b6104a2919350843d81116100e4576100d881836106f1565b91386102ba565b81513d86823e3d90fd5b8a80fd5b8980fd5b8580fd5b50346100f4576101803660031901126100f457826001600160401b0383358181116100f4576104f1903690860161072d565b9060243581811161069f57610509903690870161072d565b60443582811161036e57610520903690880161072d565b610528610779565b9160a43584811161036a576105409036908a0161072d565b60c435959091906001600160a01b0387168703610366578860e3193601126103665788519461056e866106c0565b60e43587811681036104b75786526101043587811681036104b75760208701526101243587811681036104b75761014435908882116104b3578b976020966105e4948f946105bf903690870161072d565b946105c861078f565b9b5163e12e9b2760e01b81529a8b998a99606435938b016108e7565b038188305af1610681575b506105f8578280f35b82600f8193829383549061060e8260070b610981565b16906001600160401b0319161783555af16106276109af565b5015610634578281808280f35b906020608492519162461bcd60e51b8352820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152fd5b6106989060203d81116100e4576100d881836106f1565b50386105ef565b8380fd5b8490346100e057816003193601126100e0576020915460070b8152f35b604081019081106001600160401b038211176106db57604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176106db57604052565b6001600160401b0381116106db57601f01601f191660200190565b81601f820112156107745780359061074482610712565b9261075260405194856106f1565b8284526020838301011161077457816000926020809301838601378301015290565b600080fd5b608435906001600160a01b038216820361077457565b6101643590811515820361077457565b610140600319820112610774576004906001600160401b03823581811161077457826107cc91850161072d565b9360243582811161077457836107e391860161072d565b9360443583811161077457846107fa91830161072d565b93606435936084356001600160a01b0381168103610774579360a435828111610774578361082991860161072d565b93604060c31985011261077457604051610842816106c0565b60c435848116810361077457815260e43584811681036107745760208201529361010435848116810361077457936101243590811161077457610885920161072d565b90565b9081602091031261077457516001600160401b03811681036107745790565b919082519283825260005b8481106108d3575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016108b2565b95909461092c61094f9461091e6108859c9a9b979561091160209a8c6101408091528d01906108a7565b908b82038b8d01526108a7565b9089820360408b01526108a7565b60608801939093526001600160a01b0316608087015285820360a08701526108a7565b946001600160401b039281848093511660c087015201511660e0840152166101008201526101208184039101526108a7565b60070b677fffffffffffffff81146109995760010190565b634e487b7160e01b600052601160045260246000fd5b3d156109da573d906109c082610712565b916109ce60405193846106f1565b82523d6000602084013e565b606090565b156109e657565b60405162461bcd60e51b815260206004820152601e60248201527f4661696c656420746f2073656e6420457468657220746f2073656e64657200006044820152606490fdfea26469706673582212208791b3d3dbefb3ff5d8becbb8ea142afe50bff91ecc385918766b552c4a8067464736f6c63430008140033", - "deployedBytecode": "0x608060408181526004908136101561001657600080fd5b600092833560e01c90816361bc221a146106a357508063b42bc5a9146104bf578063bcc45b7914610372578063c352645014610179578063d0e30db014610167578063d8bb6c0e146100f85763e12e9b271461007157600080fd5b346100f45760206100a86100843661079f565b8b5163632535b960e01b81529c8d9a8b9a9099929893979496949392918b016108e7565b0381866108025af19081156100eb57506100c0575080fd5b6100e09060203d81116100e4575b6100d881836106f1565b810190610888565b5080fd5b503d6100ce565b513d84823e3d90fd5b8280fd5b50346100f457602061010c6100843661079f565b0381866108025af191821561015d5760209392610135575b506001600160401b03905191168152f35b6001600160401b0391925061015690843d81116100e4576100d881836106f1565b9190610124565b81513d85823e3d90fd5b83806003193601126101765780f35b80fd5b50346100f4576101803660031901126100f4576001600160401b0390823582811161036e576101ab903690850161072d565b936024358381116100e0576101c3903690860161072d565b6044358481116100f4576101da903690870161072d565b956101e3610779565b60a43586811161036e576101fa903690890161072d565b8560c31936011261036e578551610210816106c0565b60c435888116810361036a57815260e435888116810361036a5760208201526101043591888316830361036a5761012435898111610366576102559036908c0161072d565b93610144359a8b15158c0361036257916020979695939161029b959361027961078f565b9d61032b575b8b5163632535b960e01b81529e8f998a99606435938b016108e7565b0381846108025af193841561031f576020958295610300575b506102c2575b505191168152f35b806102fa91546102d48160070b610981565b8516906001600160401b031916178155808080600f335af16102f46109af565b506109df565b386102ba565b610318919550863d81116100e4576100d881836106f1565b93386102b4565b509051903d90823e3d90fd5b8a548d61033a8260070b610981565b16906001600160401b031916178b5561035d8b808080600f335af16102f46109af565b61027f565b8880fd5b8780fd5b8680fd5b8480fd5b50346100f4576101203660031901126100f4576001600160401b0390823582811161036e576103a4903690850161072d565b6024358381116104bb576103bb903690860161072d565b60443584811161036a576103d2903690870161072d565b90608435858111610366576103ea903690880161072d565b928460a31936011261036657845190610402826106c0565b60a43587811681036104b757825260c43587811681036104b757602083015260e43587811681036104b75761010435928884116104b35760209661044c61046b9536908d0161072d565b9389519b8c98899863632535b960e01b8a523093606435938b016108e7565b0381876108025af19283156104a9576020949361048a57505191168152f35b6104a2919350843d81116100e4576100d881836106f1565b91386102ba565b81513d86823e3d90fd5b8a80fd5b8980fd5b8580fd5b50346100f4576101803660031901126100f457826001600160401b0383358181116100f4576104f1903690860161072d565b9060243581811161069f57610509903690870161072d565b60443582811161036e57610520903690880161072d565b610528610779565b9160a43584811161036a576105409036908a0161072d565b60c435959091906001600160a01b0387168703610366578860e3193601126103665788519461056e866106c0565b60e43587811681036104b75786526101043587811681036104b75760208701526101243587811681036104b75761014435908882116104b3578b976020966105e4948f946105bf903690870161072d565b946105c861078f565b9b5163e12e9b2760e01b81529a8b998a99606435938b016108e7565b038188305af1610681575b506105f8578280f35b82600f8193829383549061060e8260070b610981565b16906001600160401b0319161783555af16106276109af565b5015610634578281808280f35b906020608492519162461bcd60e51b8352820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152fd5b6106989060203d81116100e4576100d881836106f1565b50386105ef565b8380fd5b8490346100e057816003193601126100e0576020915460070b8152f35b604081019081106001600160401b038211176106db57604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176106db57604052565b6001600160401b0381116106db57601f01601f191660200190565b81601f820112156107745780359061074482610712565b9261075260405194856106f1565b8284526020838301011161077457816000926020809301838601378301015290565b600080fd5b608435906001600160a01b038216820361077457565b6101643590811515820361077457565b610140600319820112610774576004906001600160401b03823581811161077457826107cc91850161072d565b9360243582811161077457836107e391860161072d565b9360443583811161077457846107fa91830161072d565b93606435936084356001600160a01b0381168103610774579360a435828111610774578361082991860161072d565b93604060c31985011261077457604051610842816106c0565b60c435848116810361077457815260e43584811681036107745760208201529361010435848116810361077457936101243590811161077457610885920161072d565b90565b9081602091031261077457516001600160401b03811681036107745790565b919082519283825260005b8481106108d3575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016108b2565b95909461092c61094f9461091e6108859c9a9b979561091160209a8c6101408091528d01906108a7565b908b82038b8d01526108a7565b9089820360408b01526108a7565b60608801939093526001600160a01b0316608087015285820360a08701526108a7565b946001600160401b039281848093511660c087015201511660e0840152166101008201526101208184039101526108a7565b60070b677fffffffffffffff81146109995760010190565b634e487b7160e01b600052601160045260246000fd5b3d156109da573d906109c082610712565b916109ce60405193846106f1565b82523d6000602084013e565b606090565b156109e657565b60405162461bcd60e51b815260206004820152601e60248201527f4661696c656420746f2073656e6420457468657220746f2073656e64657200006044820152606490fdfea26469706673582212208791b3d3dbefb3ff5d8becbb8ea142afe50bff91ecc385918766b552c4a8067464736f6c63430008140033", + "bytecode": "0x60808060405234601557610a94908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816361bc221a146106cb57508063b42bc5a9146104b3578063bcc45b791461037f578063c352645014610158578063d0e30db01461014b578063d8bb6c0e146100f15763e12e9b2714610069575f80fd5b346100db576100a4602061007c366107d2565b60405163632535b960e01b81529a8b998a999198929793969495949392919060048b01610920565b03815f6108025af180156100e6576100ba575f80fd5b6100db9060203d6020116100df575b6100d38183610716565b8101906108dd565b5f80fd5b503d6100c9565b6040513d5f823e3d90fd5b346100db57610104602061007c366107d2565b03815f6108025af180156100e6576020915f9161012e575b506001600160401b0360405191168152f35b6101459150823d84116100df576100d38183610716565b8261011c565b5f3660031901126100db57005b346100db576101803660031901126100db576004356001600160401b0381116100db57610189903690600401610752565b6024356001600160401b0381116100db576101a8903690600401610752565b6044356001600160401b0381116100db576101c7903690600401610752565b906101d0610798565b9160a4356001600160401b0381116100db576101f0903690600401610752565b9160403660c31901126100db576040519361020a856106e7565b60c4356001600160401b03811681036100db57855260e4356001600160401b03811681036100db576020860152610104356001600160401b03811681036100db57610124356001600160401b0381116100db5761026b903690600401610752565b90610144359687151588036100db576020966102ae946102896107c2565b99610341575b60405163632535b960e01b81529a8b9889986064359260048b01610920565b03815f6108025af19081156100e6576020925f92610322575b506102de575b6001600160401b0360405191168152f35b5f546102ec8160070b6109b7565b6001600160401b0316906001600160401b031916175f5561031d5f808080600f335af16103176109e3565b50610a12565b6102cd565b61033a919250833d85116100df576100d38183610716565b90836102c7565b5f5461034f8160070b6109b7565b6001600160401b0316906001600160401b031916175f5561037a5f808080600f335af16103176109e3565b61028f565b346100db576101203660031901126100db576004356001600160401b0381116100db576103b0903690600401610752565b6024356001600160401b0381116100db576103cf903690600401610752565b906044356001600160401b0381116100db576103ef903690600401610752565b906084356001600160401b0381116100db5761040f903690600401610752565b9160403660a31901126100db5760405192610429846106e7565b60a4356001600160401b03811681036100db57845260c4356001600160401b03811681036100db57602085015260e435906001600160401b03821682036100db5761010435916001600160401b0383116100db57602095610491610104943690600401610752565b92604051988997889763632535b960e01b895230926064359260048b01610920565b346100db576101803660031901126100db576004356001600160401b0381116100db576104e4903690600401610752565b6024356001600160401b0381116100db57610503903690600401610752565b906044356001600160401b0381116100db57610523903690600401610752565b9061052c610798565b9160a4356001600160401b0381116100db5761054c903690600401610752565b60c435949091906001600160a01b03861686036100db5760403660e31901126100db576040519261057c846106e7565b60e4356001600160401b03811681036100db578452610104356001600160401b03811681036100db57602085015261012435906001600160401b03821682036100db5761014435916001600160401b0383116100db576020956105e661060f943690600401610752565b926105ef6107c2565b99604051998a98899863e12e9b2760e01b8a526064359260048b01610920565b03815f305af16106ae575b5061062157005b5f8080600f819482546106368160070b6109b7565b6001600160401b0316906001600160401b0319161783555af16106576109e3565b501561065f57005b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b6106c69060203d6020116100df576100d38183610716565b61061a565b346100db575f3660031901126100db576020905f5460070b8152f35b604081019081106001600160401b0382111761070257604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761070257604052565b6001600160401b03811161070257601f01601f191660200190565b81601f820112156100db5780359061076982610737565b926107776040519485610716565b828452602083830101116100db57815f926020809301838601378301015290565b608435906001600160a01b03821682036100db57565b35906001600160401b03821682036100db57565b610164359081151582036100db57565b6101406003198201126100db576004356001600160401b0381116100db57816107fd91600401610752565b916024356001600160401b0381116100db578261081c91600401610752565b916044356001600160401b0381116100db578161083b91600401610752565b91606435916084356001600160a01b03811681036100db579160a4356001600160401b0381116100db578261087291600401610752565b91604060c48203126100db5760405161088a816106e7565b61089460c46107ae565b81526108a060e46107ae565b602082015291610104356001600160401b03811681036100db579161012435906001600160401b0382116100db576108da91600401610752565b90565b908160209103126100db57516001600160401b03811681036100db5790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b95936108da999798946001600160401b039661096d889661095f602097610952610990986101408f81815201906108fc565b8d81038a8f0152906108fc565b908b820360408d01526108fc565b60608a01939093526001600160a01b0316608089015287820360a08901526108fc565b968281511660c087015201511660e0840152166101008201526101208184039101526108fc565b60070b677fffffffffffffff81146109cf5760010190565b634e487b7160e01b5f52601160045260245ffd5b3d15610a0d573d906109f482610737565b91610a026040519384610716565b82523d5f602084013e565b606090565b15610a1957565b60405162461bcd60e51b815260206004820152601e60248201527f4661696c656420746f2073656e6420457468657220746f2073656e64657200006044820152606490fdfea2646970667358221220d786f7f86056d9ff0da4264f0e702892dd2f9171964a0403c9f83148cac5c82764736f6c634300081a0033", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c90816361bc221a146106cb57508063b42bc5a9146104b3578063bcc45b791461037f578063c352645014610158578063d0e30db01461014b578063d8bb6c0e146100f15763e12e9b2714610069575f80fd5b346100db576100a4602061007c366107d2565b60405163632535b960e01b81529a8b998a999198929793969495949392919060048b01610920565b03815f6108025af180156100e6576100ba575f80fd5b6100db9060203d6020116100df575b6100d38183610716565b8101906108dd565b5f80fd5b503d6100c9565b6040513d5f823e3d90fd5b346100db57610104602061007c366107d2565b03815f6108025af180156100e6576020915f9161012e575b506001600160401b0360405191168152f35b6101459150823d84116100df576100d38183610716565b8261011c565b5f3660031901126100db57005b346100db576101803660031901126100db576004356001600160401b0381116100db57610189903690600401610752565b6024356001600160401b0381116100db576101a8903690600401610752565b6044356001600160401b0381116100db576101c7903690600401610752565b906101d0610798565b9160a4356001600160401b0381116100db576101f0903690600401610752565b9160403660c31901126100db576040519361020a856106e7565b60c4356001600160401b03811681036100db57855260e4356001600160401b03811681036100db576020860152610104356001600160401b03811681036100db57610124356001600160401b0381116100db5761026b903690600401610752565b90610144359687151588036100db576020966102ae946102896107c2565b99610341575b60405163632535b960e01b81529a8b9889986064359260048b01610920565b03815f6108025af19081156100e6576020925f92610322575b506102de575b6001600160401b0360405191168152f35b5f546102ec8160070b6109b7565b6001600160401b0316906001600160401b031916175f5561031d5f808080600f335af16103176109e3565b50610a12565b6102cd565b61033a919250833d85116100df576100d38183610716565b90836102c7565b5f5461034f8160070b6109b7565b6001600160401b0316906001600160401b031916175f5561037a5f808080600f335af16103176109e3565b61028f565b346100db576101203660031901126100db576004356001600160401b0381116100db576103b0903690600401610752565b6024356001600160401b0381116100db576103cf903690600401610752565b906044356001600160401b0381116100db576103ef903690600401610752565b906084356001600160401b0381116100db5761040f903690600401610752565b9160403660a31901126100db5760405192610429846106e7565b60a4356001600160401b03811681036100db57845260c4356001600160401b03811681036100db57602085015260e435906001600160401b03821682036100db5761010435916001600160401b0383116100db57602095610491610104943690600401610752565b92604051988997889763632535b960e01b895230926064359260048b01610920565b346100db576101803660031901126100db576004356001600160401b0381116100db576104e4903690600401610752565b6024356001600160401b0381116100db57610503903690600401610752565b906044356001600160401b0381116100db57610523903690600401610752565b9061052c610798565b9160a4356001600160401b0381116100db5761054c903690600401610752565b60c435949091906001600160a01b03861686036100db5760403660e31901126100db576040519261057c846106e7565b60e4356001600160401b03811681036100db578452610104356001600160401b03811681036100db57602085015261012435906001600160401b03821682036100db5761014435916001600160401b0383116100db576020956105e661060f943690600401610752565b926105ef6107c2565b99604051998a98899863e12e9b2760e01b8a526064359260048b01610920565b03815f305af16106ae575b5061062157005b5f8080600f819482546106368160070b6109b7565b6001600160401b0316906001600160401b0319161783555af16106576109e3565b501561065f57005b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b6106c69060203d6020116100df576100d38183610716565b61061a565b346100db575f3660031901126100db576020905f5460070b8152f35b604081019081106001600160401b0382111761070257604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761070257604052565b6001600160401b03811161070257601f01601f191660200190565b81601f820112156100db5780359061076982610737565b926107776040519485610716565b828452602083830101116100db57815f926020809301838601378301015290565b608435906001600160a01b03821682036100db57565b35906001600160401b03821682036100db57565b610164359081151582036100db57565b6101406003198201126100db576004356001600160401b0381116100db57816107fd91600401610752565b916024356001600160401b0381116100db578261081c91600401610752565b916044356001600160401b0381116100db578161083b91600401610752565b91606435916084356001600160a01b03811681036100db579160a4356001600160401b0381116100db578261087291600401610752565b91604060c48203126100db5760405161088a816106e7565b61089460c46107ae565b81526108a060e46107ae565b602082015291610104356001600160401b03811681036100db579161012435906001600160401b0382116100db576108da91600401610752565b90565b908160209103126100db57516001600160401b03811681036100db5790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b95936108da999798946001600160401b039661096d889661095f602097610952610990986101408f81815201906108fc565b8d81038a8f0152906108fc565b908b820360408d01526108fc565b60608a01939093526001600160a01b0316608089015287820360a08901526108fc565b968281511660c087015201511660e0840152166101008201526101208184039101526108fc565b60070b677fffffffffffffff81146109cf5760010190565b634e487b7160e01b5f52601160045260245ffd5b3d15610a0d573d906109f482610737565b91610a026040519384610716565b82523d5f602084013e565b606090565b15610a1957565b60405162461bcd60e51b815260206004820152601e60248201527f4661696c656420746f2073656e6420457468657220746f2073656e64657200006044820152606490fdfea2646970667358221220d786f7f86056d9ff0da4264f0e702892dd2f9171964a0403c9f83148cac5c82764736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/testutil/contracts/ICS20Caller.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/testutil/contracts/InterchainSender.json b/precompiles/testutil/contracts/InterchainSender.json index ece2e4700..d2b8bbe5f 100644 --- a/precompiles/testutil/contracts/InterchainSender.json +++ b/precompiles/testutil/contracts/InterchainSender.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "InterchainSender", "sourceName": "solidity/precompiles/testutil/contracts/InterchainSender.sol", "abi": [ @@ -404,8 +404,11 @@ "type": "function" } ], - "bytecode": "0x6080806040523461001657611101908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80631dba685b146107e757806344c286701461055157806361bc221a146105305780636fdf23cc146104f95780637492bdd81461045e578063accc7b901461038a578063b9672879146101485763c595699a1461007457600080fd5b34610137576020366003190112610137576001600160401b036004358181116101375760006100aa6100cc923690600401610b0c565b6040518093819263b5cb6e7d60e01b8352602060048401526024830190610ba2565b03816108025afa90811561013c576000916100fc575b604051602080825281906100f890820185610ba2565b0390f35b90503d806000833e61010e8183610ad0565b8101602082820312610137578151928311610137576100f8926101319201610fa7565b386100e2565b600080fd5b6040513d6000823e3d90fd5b34610137576003196101203682011261013757610163610a89565b6001600160a01b03916024358381169190829003610137576001600160401b03916044358381116101375761019c903690600401610b0c565b606435848111610137576101b4903690600401610b0c565b91608435858111610137576101cd903690600401610b0c565b9160c435868111610137576101e6903690600401610b0c565b926101ef610b53565b958989896101fb610b62565b99610361575b50505060405161021081610a9f565b606481526020958695869485840160649052604051998a9763632535b960e01b8952600489016101409052610144890161024991610ba2565b868982030160248a015261025c91610ba2565b8588820301604489015261026f91610ba2565b9060a43560648801526084870152838682030160a487015261029091610ba2565b9060c485016102b491602090816001600160401b0391828151168552015116910152565b6101048401600090528381039182016101248501526000905201815a610802600091f1801561013c5761032d575b50506102ea57005b600080650da475abf00061032b958295839584549061030b8260070b610e07565b16906001600160401b031916178455165af1610325610e35565b50610e65565b005b81813d831161035a575b6103418183610ad0565b810103126101375761035290610d4c565b5084806102e2565b503d610337565b600080650da475abf000610382958295839584549061030b8260070b610e07565b898989610201565b3461013757602080600319360112610137576001600160401b03906004358281116101375760006103c26103f7923690600401610b0c565b6060846040516103d181610a9f565b828152015260405180938192632f8fcc5160e11b83528660048401526024830190610ba2565b03816108025afa92831561013c57600093610423575b50506100f8604051928284938452830190610bc7565b909192503d806000843e6104378184610ad0565b8201908383830312610137578251908111610137576104569201610fc1565b90828061040d565b3461013757610495602061047136610c77565b93989496604093919351998a98899863632535b960e01b8a52339360048b01610d60565b038160006108025af1801561013c576000906104c0575b6020906001600160401b0360405191168152f35b506020813d82116104f1575b816104d960209383610ad0565b81010312610137576104ec602091610d4c565b6104ac565b3d91506104cc565b3461013757610495602061050c36610c77565b93989496604093919351998a98899863632535b960e01b8a52309360048b01610d60565b3461013757600036600319011261013757602060005460070b604051908152f35b346101375760031960203682018113610137576001600160401b03916004358381116101375760a0813603928301126101375760008360405161059381610a9f565b6060815201526040519163303eac4160e21b8352836004840152816004013590602219018112156101375781016024600482013591019185821161013757813603831361013757838261063f608460e494849660009860a060248801528160c488015287870137878685870101528a61060e60248301610c63565b1660448601528a61062160448301610c63565b16606486015261063360648201610b72565b15158286015201610b72565b151560a4830152601f01601f191681010301816108025afa90811561013c576000906000926106ec575b50604051926040840194604085528251809652606085018260608860051b8801019401906000905b8882106106c45750505084809650830382860152816106b98551604086526040860190610ba2565b940151169101520390f35b90919484806106df600193605f198c82030186528951610bc7565b9701920192019091610691565b9150503d806000833e6106ff8183610ad0565b8101906040818303126101375780518481116101375781019082601f8301121561013757815161072e81610f59565b9261073c6040519485610ad0565b818452858085019260051b8201019185831161013757868201905b8382106107c2575050505083810151908582116101375701604081840312610137576040519261078684610a9f565b81518681116101375782019181601f84011215610137576107b0869284846107b896519101610f70565b855201610d4c565b8383015284610669565b81518981116101375788916107dc89848094880101610fc1565b815201910190610757565b346101375761012036600319011261013757610801610a89565b6024356001600160401b03811161013757610820903690600401610b0c565b6044356001600160401b0381116101375761083f903690600401610b0c565b906064356001600160401b0381116101375761085f903690600401610b0c565b60a4356001600160401b0381116101375761087e903690600401610b0c565b9060c43593841515850361013757610894610b53565b9261089d610b62565b95610a3b575b60405180946108b182610a9f565b60648252606460208301526020838a6108e8604051958693849363632535b960e01b85528d8c8c60843560011c9260048901610ebb565b038160006108025af191821561013c5789926109f3575b509160209591610930936109cf575b60405163632535b960e01b8152978896879660843560011c9260048901610ebb565b038160006108025af1801561013c57610996575b5061094b57005b6000808080650da475abf00061032b9582546109698160070b610e07565b6001600160401b031667ffffffffffffffff19919091161783556001600160a01b03165af1610325610e35565b6020813d6020116109c7575b816109af60209383610ad0565b81010312610137576109c090610d4c565b5082610944565b3d91506109a2565b6000808080650da475abf0006109ed9582546109698160070b610e07565b8861090e565b959150916020863d602011610a33575b81610a1060209383610ad0565b81010312610137578861093093610a28602098610d4c565b5091935091956108ff565b3d9150610a03565b600054610a4a8160070b610e07565b6001600160401b0316906001600160401b03191617600055610a846000808080650da475abf00060018060a01b038d165af1610325610e35565b6108a3565b600435906001600160a01b038216820361013757565b604081019081106001600160401b03821117610aba57604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b03821117610aba57604052565b6001600160401b038111610aba57601f01601f191660200190565b81601f8201121561013757803590610b2382610af1565b92610b316040519485610ad0565b8284526020838301011161013757816000926020809301838601378301015290565b60e43590811515820361013757565b6101043590811515820361013757565b3590811515820361013757565b60005b838110610b925750506000910152565b8181015183820152602001610b82565b90602091610bbb81518092818552858086019101610b7f565b601f01601f1916010190565b805190610bdc60409283855283850190610ba2565b90602080910151938181840391015283519182815281810182808560051b8401019601946000925b858410610c15575050505050505090565b909192939495968580610c52600193601f198682030188528b519083610c4283518a84528a840190610ba2565b9201519084818403910152610ba2565b990194019401929594939190610c04565b35906001600160401b038216820361013757565b610120600319820112610137576004916001600160401b039083358281116101375783610ca5918601610b0c565b936024358381116101375784610cbc918301610b0c565b936044358481116101375781610cd3918401610b0c565b93606435936084358281116101375783610cee918601610b0c565b93604060a31985011261013757604051610d0781610a9f565b60a435848116810361013757815260c43584811681036101375760208201529360e435848116810361013757936101043590811161013757610d499201610b0c565b90565b51906001600160401b038216820361013757565b956001600160401b0395610dae610df295610da0610dd196610d92610d499f9d9e9a978d610140908181520190610ba2565b8c810360208e015290610ba2565b908a820360408c0152610ba2565b60608901939093526001600160a01b0316608088015286820360a0880152610ba2565b9560c0850190602090816001600160401b0391828151168552015116910152565b16610100820152610120818403910152610ba2565b60070b677fffffffffffffff8114610e1f5760010190565b634e487b7160e01b600052601160045260246000fd5b3d15610e60573d90610e4682610af1565b91610e546040519384610ad0565b82523d6000602084013e565b606090565b15610e6c57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b94610efc610f1f94610eee610f409795610ee160209c9b96610140808d528c0190610ba2565b908a82038d8c0152610ba2565b9088820360408a0152610ba2565b60608701939093526001600160a01b0316608086015284820360a0860152610ba2565b9260c0830190602090816001600160401b0391828151168552015116910152565b6000610100820152610120818303910152600081520190565b6001600160401b038111610aba5760051b60200190565b90929192610f7d81610af1565b91610f8b6040519384610ad0565b829482845282820111610137576020610fa5930190610b7f565b565b9080601f83011215610137578151610d4992602001610f70565b91906040928381830312610137578351610fda81610a9f565b80948251936001600160401b03948581116101375781610ffb918601610fa7565b8352602093848101519086821161013757019181601f840112156101375782519061102582610f59565b9661103282519889610ad0565b828852868089019360051b8601019484861161013757878101935b86851061105f57505050505050500152565b84518381116101375782019084601f1983890301126101375784519061108482610a9f565b8a83015185811161013757888c61109d92860101610fa7565b82528583015191858311610137576110bc898d80969581960101610fa7565b8382015281520194019361104d56fea264697066735822122051814c264fbc9ad728c93acc6f2ffed8fd0c82f027781cd49e1e7fee771c9b4164736f6c63430008140033", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80631dba685b146107e757806344c286701461055157806361bc221a146105305780636fdf23cc146104f95780637492bdd81461045e578063accc7b901461038a578063b9672879146101485763c595699a1461007457600080fd5b34610137576020366003190112610137576001600160401b036004358181116101375760006100aa6100cc923690600401610b0c565b6040518093819263b5cb6e7d60e01b8352602060048401526024830190610ba2565b03816108025afa90811561013c576000916100fc575b604051602080825281906100f890820185610ba2565b0390f35b90503d806000833e61010e8183610ad0565b8101602082820312610137578151928311610137576100f8926101319201610fa7565b386100e2565b600080fd5b6040513d6000823e3d90fd5b34610137576003196101203682011261013757610163610a89565b6001600160a01b03916024358381169190829003610137576001600160401b03916044358381116101375761019c903690600401610b0c565b606435848111610137576101b4903690600401610b0c565b91608435858111610137576101cd903690600401610b0c565b9160c435868111610137576101e6903690600401610b0c565b926101ef610b53565b958989896101fb610b62565b99610361575b50505060405161021081610a9f565b606481526020958695869485840160649052604051998a9763632535b960e01b8952600489016101409052610144890161024991610ba2565b868982030160248a015261025c91610ba2565b8588820301604489015261026f91610ba2565b9060a43560648801526084870152838682030160a487015261029091610ba2565b9060c485016102b491602090816001600160401b0391828151168552015116910152565b6101048401600090528381039182016101248501526000905201815a610802600091f1801561013c5761032d575b50506102ea57005b600080650da475abf00061032b958295839584549061030b8260070b610e07565b16906001600160401b031916178455165af1610325610e35565b50610e65565b005b81813d831161035a575b6103418183610ad0565b810103126101375761035290610d4c565b5084806102e2565b503d610337565b600080650da475abf000610382958295839584549061030b8260070b610e07565b898989610201565b3461013757602080600319360112610137576001600160401b03906004358281116101375760006103c26103f7923690600401610b0c565b6060846040516103d181610a9f565b828152015260405180938192632f8fcc5160e11b83528660048401526024830190610ba2565b03816108025afa92831561013c57600093610423575b50506100f8604051928284938452830190610bc7565b909192503d806000843e6104378184610ad0565b8201908383830312610137578251908111610137576104569201610fc1565b90828061040d565b3461013757610495602061047136610c77565b93989496604093919351998a98899863632535b960e01b8a52339360048b01610d60565b038160006108025af1801561013c576000906104c0575b6020906001600160401b0360405191168152f35b506020813d82116104f1575b816104d960209383610ad0565b81010312610137576104ec602091610d4c565b6104ac565b3d91506104cc565b3461013757610495602061050c36610c77565b93989496604093919351998a98899863632535b960e01b8a52309360048b01610d60565b3461013757600036600319011261013757602060005460070b604051908152f35b346101375760031960203682018113610137576001600160401b03916004358381116101375760a0813603928301126101375760008360405161059381610a9f565b6060815201526040519163303eac4160e21b8352836004840152816004013590602219018112156101375781016024600482013591019185821161013757813603831361013757838261063f608460e494849660009860a060248801528160c488015287870137878685870101528a61060e60248301610c63565b1660448601528a61062160448301610c63565b16606486015261063360648201610b72565b15158286015201610b72565b151560a4830152601f01601f191681010301816108025afa90811561013c576000906000926106ec575b50604051926040840194604085528251809652606085018260608860051b8801019401906000905b8882106106c45750505084809650830382860152816106b98551604086526040860190610ba2565b940151169101520390f35b90919484806106df600193605f198c82030186528951610bc7565b9701920192019091610691565b9150503d806000833e6106ff8183610ad0565b8101906040818303126101375780518481116101375781019082601f8301121561013757815161072e81610f59565b9261073c6040519485610ad0565b818452858085019260051b8201019185831161013757868201905b8382106107c2575050505083810151908582116101375701604081840312610137576040519261078684610a9f565b81518681116101375782019181601f84011215610137576107b0869284846107b896519101610f70565b855201610d4c565b8383015284610669565b81518981116101375788916107dc89848094880101610fc1565b815201910190610757565b346101375761012036600319011261013757610801610a89565b6024356001600160401b03811161013757610820903690600401610b0c565b6044356001600160401b0381116101375761083f903690600401610b0c565b906064356001600160401b0381116101375761085f903690600401610b0c565b60a4356001600160401b0381116101375761087e903690600401610b0c565b9060c43593841515850361013757610894610b53565b9261089d610b62565b95610a3b575b60405180946108b182610a9f565b60648252606460208301526020838a6108e8604051958693849363632535b960e01b85528d8c8c60843560011c9260048901610ebb565b038160006108025af191821561013c5789926109f3575b509160209591610930936109cf575b60405163632535b960e01b8152978896879660843560011c9260048901610ebb565b038160006108025af1801561013c57610996575b5061094b57005b6000808080650da475abf00061032b9582546109698160070b610e07565b6001600160401b031667ffffffffffffffff19919091161783556001600160a01b03165af1610325610e35565b6020813d6020116109c7575b816109af60209383610ad0565b81010312610137576109c090610d4c565b5082610944565b3d91506109a2565b6000808080650da475abf0006109ed9582546109698160070b610e07565b8861090e565b959150916020863d602011610a33575b81610a1060209383610ad0565b81010312610137578861093093610a28602098610d4c565b5091935091956108ff565b3d9150610a03565b600054610a4a8160070b610e07565b6001600160401b0316906001600160401b03191617600055610a846000808080650da475abf00060018060a01b038d165af1610325610e35565b6108a3565b600435906001600160a01b038216820361013757565b604081019081106001600160401b03821117610aba57604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b03821117610aba57604052565b6001600160401b038111610aba57601f01601f191660200190565b81601f8201121561013757803590610b2382610af1565b92610b316040519485610ad0565b8284526020838301011161013757816000926020809301838601378301015290565b60e43590811515820361013757565b6101043590811515820361013757565b3590811515820361013757565b60005b838110610b925750506000910152565b8181015183820152602001610b82565b90602091610bbb81518092818552858086019101610b7f565b601f01601f1916010190565b805190610bdc60409283855283850190610ba2565b90602080910151938181840391015283519182815281810182808560051b8401019601946000925b858410610c15575050505050505090565b909192939495968580610c52600193601f198682030188528b519083610c4283518a84528a840190610ba2565b9201519084818403910152610ba2565b990194019401929594939190610c04565b35906001600160401b038216820361013757565b610120600319820112610137576004916001600160401b039083358281116101375783610ca5918601610b0c565b936024358381116101375784610cbc918301610b0c565b936044358481116101375781610cd3918401610b0c565b93606435936084358281116101375783610cee918601610b0c565b93604060a31985011261013757604051610d0781610a9f565b60a435848116810361013757815260c43584811681036101375760208201529360e435848116810361013757936101043590811161013757610d499201610b0c565b90565b51906001600160401b038216820361013757565b956001600160401b0395610dae610df295610da0610dd196610d92610d499f9d9e9a978d610140908181520190610ba2565b8c810360208e015290610ba2565b908a820360408c0152610ba2565b60608901939093526001600160a01b0316608088015286820360a0880152610ba2565b9560c0850190602090816001600160401b0391828151168552015116910152565b16610100820152610120818403910152610ba2565b60070b677fffffffffffffff8114610e1f5760010190565b634e487b7160e01b600052601160045260246000fd5b3d15610e60573d90610e4682610af1565b91610e546040519384610ad0565b82523d6000602084013e565b606090565b15610e6c57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b94610efc610f1f94610eee610f409795610ee160209c9b96610140808d528c0190610ba2565b908a82038d8c0152610ba2565b9088820360408a0152610ba2565b60608701939093526001600160a01b0316608086015284820360a0860152610ba2565b9260c0830190602090816001600160401b0391828151168552015116910152565b6000610100820152610120818303910152600081520190565b6001600160401b038111610aba5760051b60200190565b90929192610f7d81610af1565b91610f8b6040519384610ad0565b829482845282820111610137576020610fa5930190610b7f565b565b9080601f83011215610137578151610d4992602001610f70565b91906040928381830312610137578351610fda81610a9f565b80948251936001600160401b03948581116101375781610ffb918601610fa7565b8352602093848101519086821161013757019181601f840112156101375782519061102582610f59565b9661103282519889610ad0565b828852868089019360051b8601019484861161013757878101935b86851061105f57505050505050500152565b84518381116101375782019084601f1983890301126101375784519061108482610a9f565b8a83015185811161013757888c61109d92860101610fa7565b82528583015191858311610137576110bc898d80969581960101610fa7565b8382015281520194019361104d56fea264697066735822122051814c264fbc9ad728c93acc6f2ffed8fd0c82f027781cd49e1e7fee771c9b4164736f6c63430008140033", + "bytecode": "0x60808060405234601557611116908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80631dba685b1461083f57806344c286701461056957806361bc221a1461054a5780636fdf23cc146105135780637492bdd814610479578063accc7b90146103a1578063b9672879146101475763c595699a14610071575f80fd5b34610138576020366003190112610138576004356001600160401b038111610138575f6100a56100c7923690600401610afe565b6040518093819263b5cb6e7d60e01b8352602060048401526024830190610b70565b03816108025afa801561013c575f906100f7575b6100f390604051918291602083526020830190610b70565b0390f35b503d805f833e6101078183610ac2565b810190602081830312610138578051916001600160401b038311610138576100f3926101339201610ef8565b6100db565b5f80fd5b6040513d5f823e3d90fd5b346101385761012036600319011261013857610161610a7d565b6024356001600160a01b03811690819003610138576044356001600160401b03811161013857610195903690600401610afe565b906064356001600160401b038111610138576101b5903690600401610afe565b906084356001600160401b038111610138576101d5903690600401610afe565b9060c435926001600160401b0384116101385785946102c36102a360049460209694610284889661027261020f6101409c36908c01610afe565b93610218610b44565b9d610221610b53565b9e61037e575b50610260604051996102388b610a93565b60648b5260648c8c01526040519e8f9d8e63632535b960e01b815201526101448d0190610b70565b8b81036003190160248d015290610b70565b8981036003190160448b015290610b70565b9160a435606489015260848801526003198783030160a4880152610b70565b9160c48501906001600160401b0360208092828151168552015116910152565b5f6101048401525f8382039160031983016101248601525201815f6108025af1801561013c57610347575b506102f557005b5f808080650da475abf0006103459582546103128160070b610d49565b6001600160401b031667ffffffffffffffff19919091161783556001600160a01b03165af161033f610d75565b50610da4565b005b6020813d602011610376575b8161036060209383610ac2565b810103126101385761037190610dfa565b6102ee565b3d9150610353565b5f808080650da475abf00061039b9582546103128160070b610d49565b8e610227565b34610138576020366003190112610138576004356001600160401b038111610138575f6103d561040c923690600401610afe565b606060206040516103e581610a93565b828152015260405180938192632f8fcc5160e11b8352602060048401526024830190610b70565b03816108025afa801561013c575f90610438575b6100f390604051918291602083526020830190610b94565b503d805f833e6104488183610ac2565b810190602081830312610138578051916001600160401b038311610138576100f3926104749201610f12565b610420565b34610138576104b0602061048c36610c3f565b93989496604093919351998a98899863632535b960e01b8a52339360048b0161103b565b03815f6108025af1801561013c575f906104d9575b6020906001600160401b0360405191168152f35b506020813d60201161050b575b816104f360209383610ac2565b8101031261013857610506602091610dfa565b6104c5565b3d91506104e6565b34610138576104b0602061052636610c3f565b93989496604093919351998a98899863632535b960e01b8a52309360048b0161103b565b34610138575f3660031901126101385760205f5460070b604051908152f35b34610138576020366003190112610138576004356001600160401b038111610138578036039060a0600319830112610138575f60206040516105aa81610a93565b6060815201526040519163303eac4160e21b83526020600484015281600401359060221901811215610138578101602460048201359101916001600160401b03821161013857813603831361013857838261066b608460e49484965f9860a060248801528160c488015287870137878685870101526001600160401b0361063360248301610c2b565b1660448601526001600160401b0361064d60448301610c2b565b16606486015261065f60648201610b63565b15158286015201610b63565b151560a4830152601f01601f191681010301816108025afa801561013c575f915f91610722575b506040519060408201926040835280518094526060830193602060608260051b8601019201945f905b8282106106f75785808686828103602084015260206001600160401b03816106ec8551604086526040860190610b70565b940151169101520390f35b909192602080610713600193605f198a82030186528a51610b94565b980192019201909592916106bb565b9150503d805f833e6107348183610ac2565b8101906040818303126101385780516001600160401b0381116101385781019082601f8301121561013857815161076a81610eab565b926107786040519485610ac2565b81845260208085019260051b820101918583116101385760208201905b83821061081257505050506020810151906001600160401b038211610138570160408184031261013857604051926107cc84610a93565b81516001600160401b0381116101385782019181601f84011215610138576107fe602092848461080696519101610ec2565b855201610dfa565b60208301529082610692565b81516001600160401b0381116101385760209161083489848094880101610f12565b815201910190610795565b346101385761012036600319011261013857610859610a7d565b6024356001600160401b03811161013857610878903690600401610afe565b6044356001600160401b03811161013857610897903690600401610afe565b6064356001600160401b038111610138576108b6903690600401610afe565b9060a4356001600160401b038111610138576108d6903690600401610afe565b9060c4359384151585036101385785926108ee610b44565b906108f7610b53565b96610a32575b856040519261090b84610a93565b606484526064602085015260208686610942878760843560011c9c8d604051998a97889763632535b960e01b895260048901610e0e565b03815f6108025af191821561013c578a926109e7575b509060209661098394939261099c575b60405163632535b960e01b8152988997889760048901610e0e565b03815f6108025af1801561013c5761034757506102f557005b5f546109aa8160070b610d49565b6001600160401b0316906001600160401b031916175f556109e25f808080650da475abf00060018060a01b0388165af161033f610d75565b610968565b90939291506020813d602011610a2a575b81610a0560209383610ac2565b810103126101385760209661098394610a1e8c93610dfa565b50919293945096610958565b3d91506109f8565b5f54610a408160070b610d49565b6001600160401b0316906001600160401b031916175f55610a785f808080650da475abf00060018060a01b038b165af161033f610d75565b6108fd565b600435906001600160a01b038216820361013857565b604081019081106001600160401b03821117610aae57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b03821117610aae57604052565b6001600160401b038111610aae57601f01601f191660200190565b81601f8201121561013857803590610b1582610ae3565b92610b236040519485610ac2565b8284526020838301011161013857815f926020809301838601378301015290565b60e43590811515820361013857565b6101043590811515820361013857565b3590811515820361013857565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6020610ba98251604085526040850190610b70565b910151916020818303910152815180825260208201916020808360051b8301019401925f915b838310610bde57505050505090565b9091929394602080610c1c600193601f1986820301875289519083610c0c8351604084526040840190610b70565b9201519084818403910152610b70565b97019301930191939290610bcf565b35906001600160401b038216820361013857565b90610120600319830112610138576004356001600160401b0381116101385782610c6b91600401610afe565b916024356001600160401b0381116101385781610c8a91600401610afe565b916044356001600160401b0381116101385782610ca991600401610afe565b91606435916084356001600160401b0381116101385782610ccc91600401610afe565b91604060a31982011261013857604051610ce581610a93565b60a4356001600160401b038116810361013857815260c4356001600160401b03811681036101385760208201529160e4356001600160401b0381168103610138579161010435906001600160401b03821161013857610d4691600401610afe565b90565b60070b677fffffffffffffff8114610d615760010190565b634e487b7160e01b5f52601160045260245ffd5b3d15610d9f573d90610d8682610ae3565b91610d946040519384610ac2565b82523d5f602084013e565b606090565b15610dab57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b51906001600160401b038216820361013857565b94610e51610e7494610e43610e949795610e3660209c9b966101408c526101408c0190610b70565b908a82038d8c0152610b70565b9088820360408a0152610b70565b60608701939093526001600160a01b0316608086015284820360a0860152610b70565b9260c08301906001600160401b0360208092828151168552015116910152565b5f6101008201526101208183039101525f81520190565b6001600160401b038111610aae5760051b60200190565b929192610ece82610ae3565b91610edc6040519384610ac2565b829481845281830111610138578281602093845f96015e010152565b9080601f83011215610138578151610d4692602001610ec2565b919060408382031261013857604051610f2a81610a93565b809380516001600160401b0381116101385783610f48918301610ef8565b82526020810151906001600160401b03821161013857019180601f8401121561013857825192610f7784610eab565b93610f856040519586610ac2565b80855260208086019160051b830101918383116101385760208101915b838310610fb457505050505060200152565b82516001600160401b038111610138578201906040828703601f1901126101385760405190610fe282610a93565b60208301516001600160401b0381116101385787602061100492860101610ef8565b82526040830151916001600160401b0383116101385761102c88602080969581960101610ef8565b83820152815201920191610fa2565b956001600160401b03956110886110cb9561107a6110ab9661106c610d469f9d9e9a976101408e8181520190610b70565b8c810360208e015290610b70565b908a820360408c0152610b70565b60608901939093526001600160a01b0316608088015286820360a0880152610b70565b9560c08501906001600160401b0360208092828151168552015116910152565b16610100820152610120818403910152610b7056fea264697066735822122056486ebb13357830d542e76804561d45642e956087f955294ed236bac6b83b6664736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c80631dba685b1461083f57806344c286701461056957806361bc221a1461054a5780636fdf23cc146105135780637492bdd814610479578063accc7b90146103a1578063b9672879146101475763c595699a14610071575f80fd5b34610138576020366003190112610138576004356001600160401b038111610138575f6100a56100c7923690600401610afe565b6040518093819263b5cb6e7d60e01b8352602060048401526024830190610b70565b03816108025afa801561013c575f906100f7575b6100f390604051918291602083526020830190610b70565b0390f35b503d805f833e6101078183610ac2565b810190602081830312610138578051916001600160401b038311610138576100f3926101339201610ef8565b6100db565b5f80fd5b6040513d5f823e3d90fd5b346101385761012036600319011261013857610161610a7d565b6024356001600160a01b03811690819003610138576044356001600160401b03811161013857610195903690600401610afe565b906064356001600160401b038111610138576101b5903690600401610afe565b906084356001600160401b038111610138576101d5903690600401610afe565b9060c435926001600160401b0384116101385785946102c36102a360049460209694610284889661027261020f6101409c36908c01610afe565b93610218610b44565b9d610221610b53565b9e61037e575b50610260604051996102388b610a93565b60648b5260648c8c01526040519e8f9d8e63632535b960e01b815201526101448d0190610b70565b8b81036003190160248d015290610b70565b8981036003190160448b015290610b70565b9160a435606489015260848801526003198783030160a4880152610b70565b9160c48501906001600160401b0360208092828151168552015116910152565b5f6101048401525f8382039160031983016101248601525201815f6108025af1801561013c57610347575b506102f557005b5f808080650da475abf0006103459582546103128160070b610d49565b6001600160401b031667ffffffffffffffff19919091161783556001600160a01b03165af161033f610d75565b50610da4565b005b6020813d602011610376575b8161036060209383610ac2565b810103126101385761037190610dfa565b6102ee565b3d9150610353565b5f808080650da475abf00061039b9582546103128160070b610d49565b8e610227565b34610138576020366003190112610138576004356001600160401b038111610138575f6103d561040c923690600401610afe565b606060206040516103e581610a93565b828152015260405180938192632f8fcc5160e11b8352602060048401526024830190610b70565b03816108025afa801561013c575f90610438575b6100f390604051918291602083526020830190610b94565b503d805f833e6104488183610ac2565b810190602081830312610138578051916001600160401b038311610138576100f3926104749201610f12565b610420565b34610138576104b0602061048c36610c3f565b93989496604093919351998a98899863632535b960e01b8a52339360048b0161103b565b03815f6108025af1801561013c575f906104d9575b6020906001600160401b0360405191168152f35b506020813d60201161050b575b816104f360209383610ac2565b8101031261013857610506602091610dfa565b6104c5565b3d91506104e6565b34610138576104b0602061052636610c3f565b93989496604093919351998a98899863632535b960e01b8a52309360048b0161103b565b34610138575f3660031901126101385760205f5460070b604051908152f35b34610138576020366003190112610138576004356001600160401b038111610138578036039060a0600319830112610138575f60206040516105aa81610a93565b6060815201526040519163303eac4160e21b83526020600484015281600401359060221901811215610138578101602460048201359101916001600160401b03821161013857813603831361013857838261066b608460e49484965f9860a060248801528160c488015287870137878685870101526001600160401b0361063360248301610c2b565b1660448601526001600160401b0361064d60448301610c2b565b16606486015261065f60648201610b63565b15158286015201610b63565b151560a4830152601f01601f191681010301816108025afa801561013c575f915f91610722575b506040519060408201926040835280518094526060830193602060608260051b8601019201945f905b8282106106f75785808686828103602084015260206001600160401b03816106ec8551604086526040860190610b70565b940151169101520390f35b909192602080610713600193605f198a82030186528a51610b94565b980192019201909592916106bb565b9150503d805f833e6107348183610ac2565b8101906040818303126101385780516001600160401b0381116101385781019082601f8301121561013857815161076a81610eab565b926107786040519485610ac2565b81845260208085019260051b820101918583116101385760208201905b83821061081257505050506020810151906001600160401b038211610138570160408184031261013857604051926107cc84610a93565b81516001600160401b0381116101385782019181601f84011215610138576107fe602092848461080696519101610ec2565b855201610dfa565b60208301529082610692565b81516001600160401b0381116101385760209161083489848094880101610f12565b815201910190610795565b346101385761012036600319011261013857610859610a7d565b6024356001600160401b03811161013857610878903690600401610afe565b6044356001600160401b03811161013857610897903690600401610afe565b6064356001600160401b038111610138576108b6903690600401610afe565b9060a4356001600160401b038111610138576108d6903690600401610afe565b9060c4359384151585036101385785926108ee610b44565b906108f7610b53565b96610a32575b856040519261090b84610a93565b606484526064602085015260208686610942878760843560011c9c8d604051998a97889763632535b960e01b895260048901610e0e565b03815f6108025af191821561013c578a926109e7575b509060209661098394939261099c575b60405163632535b960e01b8152988997889760048901610e0e565b03815f6108025af1801561013c5761034757506102f557005b5f546109aa8160070b610d49565b6001600160401b0316906001600160401b031916175f556109e25f808080650da475abf00060018060a01b0388165af161033f610d75565b610968565b90939291506020813d602011610a2a575b81610a0560209383610ac2565b810103126101385760209661098394610a1e8c93610dfa565b50919293945096610958565b3d91506109f8565b5f54610a408160070b610d49565b6001600160401b0316906001600160401b031916175f55610a785f808080650da475abf00060018060a01b038b165af161033f610d75565b6108fd565b600435906001600160a01b038216820361013857565b604081019081106001600160401b03821117610aae57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b03821117610aae57604052565b6001600160401b038111610aae57601f01601f191660200190565b81601f8201121561013857803590610b1582610ae3565b92610b236040519485610ac2565b8284526020838301011161013857815f926020809301838601378301015290565b60e43590811515820361013857565b6101043590811515820361013857565b3590811515820361013857565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6020610ba98251604085526040850190610b70565b910151916020818303910152815180825260208201916020808360051b8301019401925f915b838310610bde57505050505090565b9091929394602080610c1c600193601f1986820301875289519083610c0c8351604084526040840190610b70565b9201519084818403910152610b70565b97019301930191939290610bcf565b35906001600160401b038216820361013857565b90610120600319830112610138576004356001600160401b0381116101385782610c6b91600401610afe565b916024356001600160401b0381116101385781610c8a91600401610afe565b916044356001600160401b0381116101385782610ca991600401610afe565b91606435916084356001600160401b0381116101385782610ccc91600401610afe565b91604060a31982011261013857604051610ce581610a93565b60a4356001600160401b038116810361013857815260c4356001600160401b03811681036101385760208201529160e4356001600160401b0381168103610138579161010435906001600160401b03821161013857610d4691600401610afe565b90565b60070b677fffffffffffffff8114610d615760010190565b634e487b7160e01b5f52601160045260245ffd5b3d15610d9f573d90610d8682610ae3565b91610d946040519384610ac2565b82523d5f602084013e565b606090565b15610dab57565b60405162461bcd60e51b815260206004820152602160248201527f4661696c656420746f2073656e6420457468657220746f2064656c656761746f6044820152603960f91b6064820152608490fd5b51906001600160401b038216820361013857565b94610e51610e7494610e43610e949795610e3660209c9b966101408c526101408c0190610b70565b908a82038d8c0152610b70565b9088820360408a0152610b70565b60608701939093526001600160a01b0316608086015284820360a0860152610b70565b9260c08301906001600160401b0360208092828151168552015116910152565b5f6101008201526101208183039101525f81520190565b6001600160401b038111610aae5760051b60200190565b929192610ece82610ae3565b91610edc6040519384610ac2565b829481845281830111610138578281602093845f96015e010152565b9080601f83011215610138578151610d4692602001610ec2565b919060408382031261013857604051610f2a81610a93565b809380516001600160401b0381116101385783610f48918301610ef8565b82526020810151906001600160401b03821161013857019180601f8401121561013857825192610f7784610eab565b93610f856040519586610ac2565b80855260208086019160051b830101918383116101385760208101915b838310610fb457505050505060200152565b82516001600160401b038111610138578201906040828703601f1901126101385760405190610fe282610a93565b60208301516001600160401b0381116101385787602061100492860101610ef8565b82526040830151916001600160401b0383116101385761102c88602080969581960101610ef8565b83820152815201920191610fa2565b956001600160401b03956110886110cb9561107a6110ab9661106c610d469f9d9e9a976101408e8181520190610b70565b8c810360208e015290610b70565b908a820360408c0152610b70565b60608901939093526001600160a01b0316608088015286820360a0880152610b70565b9560c08501906001600160401b0360208092828151168552015116910152565b16610100820152610120818403910152610b7056fea264697066735822122056486ebb13357830d542e76804561d45642e956087f955294ed236bac6b83b6664736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/testutil/contracts/InterchainSender.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/testutil/contracts/InterchainSenderCaller.json b/precompiles/testutil/contracts/InterchainSenderCaller.json index 253156a71..a58659ed8 100644 --- a/precompiles/testutil/contracts/InterchainSenderCaller.json +++ b/precompiles/testutil/contracts/InterchainSenderCaller.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "InterchainSenderCaller", "sourceName": "solidity/precompiles/testutil/contracts/InterchainSenderCaller.sol", "abi": [ @@ -180,8 +180,11 @@ "type": "function" } ], - "bytecode": "0x6080601f6106af38819003918201601f19168301916001600160401b038311848410176100815780849260209460405283398101031261007c57516001600160a01b038116810361007c5760008054600160401b600160e01b031916604092831b600160401b600160e01b03161790555161061790816100988239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6040608081526004908136101561001557600080fd5b600091823560e01c838163073989ff146102e8578163427c1cb6146102195750806361bc221a146101f557806369a98b2b146100de5763ec3c5a141461005a57600080fd5b8291346100da5761006a36610414565b88549397909593871c6001600160a01b03169392843b156100d657899687936100a7928a519b8c998a988997631dba685b60e01b89528801610510565b03925af19081156100cd57506100ba5750fd5b6100c390610382565b6100ca5780fd5b80fd5b513d84823e3d90fd5b8980fd5b5050fd5b5090346101cf57826100ef36610414565b8654989297949593949161010660078b900b6104a2565b67ffffffffffffffff199a8b1667ffffffffffffffff91821617808a55909a9990841c6001600160a01b0316803b156100d6578989899289838a6101608a8a8a8e519a8b998a988997631dba685b60e01b89528801610510565b03925af180156101eb57908a916101d7575b5050303b156101d357889661019894519889978897633b0f168560e21b89528801610585565b038183305af16101bb575b5054916101b28360070b6104a2565b16911617815580f35b6101c490610382565b6101cf5782386101a3565b8280fd5b8880fd5b6101e090610382565b6101d3578838610172565b85513d8c823e3d90fd5b5050346102155781600319360112610215576020915460070b9051908152f35b5080fd5b929050346100da5761022a36610414565b9060018060a09995949796991b038954881c16803b156100d6578989859288838961026c898f8f8b91519a8b998a988997631dba685b60e01b89528801610510565b03925af180156102de57908a916102ca575b5050303b156101d35788956102a5938851998a978897633b0f168560e21b89528801610585565b038183305af19081156100cd57506102ba5750f35b6102c390610382565b6100ca5780f35b6102d390610382565b6101d357883861027e565b88513d8c823e3d90fd5b808484346100da576102f936610414565b90889594969397929854986103108a60070b6104a2565b67ffffffffffffffff199a8b1667ffffffffffffffff9182161788559998303b1561037e576103509451988997889763213e0e5b60e11b89528801610585565b038183305af161036b575b508254916101b28360070b6104a2565b61037790939193610382565b918361035b565b8780fd5b67ffffffffffffffff811161039657604052565b634e487b7160e01b600052604160045260246000fd5b81601f8201121561040f5780359067ffffffffffffffff928383116103965760405193601f8401601f19908116603f0116850190811185821017610396576040528284526020838301011161040f57816000926020809301838601378301015290565b600080fd5b60c060031982011261040f576004356001600160a01b038116810361040f579167ffffffffffffffff60243581811161040f5783610454916004016103ac565b9260443582811161040f578161046c916004016103ac565b9260643583811161040f5782610484916004016103ac565b926084359260a43591821161040f5761049f916004016103ac565b90565b60070b677fffffffffffffff81146104ba5760010190565b634e487b7160e01b600052601160045260246000fd5b919082519283825260005b8481106104fc575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016104db565b969590610100946105536105749561054560019996610561958b8060a01b03168d5260208d61012091829101528d01906104d0565b908b820360408d01526104d0565b9089820360608b01526104d0565b91608088015286820360a08801526104d0565b938260c08201528260e08201520152565b926105c0906105b26105ce9461049f99979460018060a01b0316875260c0602088015260c08701906104d0565b9085820360408701526104d0565b9083820360608501526104d0565b92608082015260a08184039101526104d056fea264697066735822122034839481f88e1aff801b78902159f4d7ed1d3d669e8c0e715a2b7bb7448bcfc464736f6c63430008140033", - "deployedBytecode": "0x6040608081526004908136101561001557600080fd5b600091823560e01c838163073989ff146102e8578163427c1cb6146102195750806361bc221a146101f557806369a98b2b146100de5763ec3c5a141461005a57600080fd5b8291346100da5761006a36610414565b88549397909593871c6001600160a01b03169392843b156100d657899687936100a7928a519b8c998a988997631dba685b60e01b89528801610510565b03925af19081156100cd57506100ba5750fd5b6100c390610382565b6100ca5780fd5b80fd5b513d84823e3d90fd5b8980fd5b5050fd5b5090346101cf57826100ef36610414565b8654989297949593949161010660078b900b6104a2565b67ffffffffffffffff199a8b1667ffffffffffffffff91821617808a55909a9990841c6001600160a01b0316803b156100d6578989899289838a6101608a8a8a8e519a8b998a988997631dba685b60e01b89528801610510565b03925af180156101eb57908a916101d7575b5050303b156101d357889661019894519889978897633b0f168560e21b89528801610585565b038183305af16101bb575b5054916101b28360070b6104a2565b16911617815580f35b6101c490610382565b6101cf5782386101a3565b8280fd5b8880fd5b6101e090610382565b6101d3578838610172565b85513d8c823e3d90fd5b5050346102155781600319360112610215576020915460070b9051908152f35b5080fd5b929050346100da5761022a36610414565b9060018060a09995949796991b038954881c16803b156100d6578989859288838961026c898f8f8b91519a8b998a988997631dba685b60e01b89528801610510565b03925af180156102de57908a916102ca575b5050303b156101d35788956102a5938851998a978897633b0f168560e21b89528801610585565b038183305af19081156100cd57506102ba5750f35b6102c390610382565b6100ca5780f35b6102d390610382565b6101d357883861027e565b88513d8c823e3d90fd5b808484346100da576102f936610414565b90889594969397929854986103108a60070b6104a2565b67ffffffffffffffff199a8b1667ffffffffffffffff9182161788559998303b1561037e576103509451988997889763213e0e5b60e11b89528801610585565b038183305af161036b575b508254916101b28360070b6104a2565b61037790939193610382565b918361035b565b8780fd5b67ffffffffffffffff811161039657604052565b634e487b7160e01b600052604160045260246000fd5b81601f8201121561040f5780359067ffffffffffffffff928383116103965760405193601f8401601f19908116603f0116850190811185821017610396576040528284526020838301011161040f57816000926020809301838601378301015290565b600080fd5b60c060031982011261040f576004356001600160a01b038116810361040f579167ffffffffffffffff60243581811161040f5783610454916004016103ac565b9260443582811161040f578161046c916004016103ac565b9260643583811161040f5782610484916004016103ac565b926084359260a43591821161040f5761049f916004016103ac565b90565b60070b677fffffffffffffff81146104ba5760010190565b634e487b7160e01b600052601160045260246000fd5b919082519283825260005b8481106104fc575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016104db565b969590610100946105536105749561054560019996610561958b8060a01b03168d5260208d61012091829101528d01906104d0565b908b820360408d01526104d0565b9089820360608b01526104d0565b91608088015286820360a08801526104d0565b938260c08201528260e08201520152565b926105c0906105b26105ce9461049f99979460018060a01b0316875260c0602088015260c08701906104d0565b9085820360408701526104d0565b9083820360608501526104d0565b92608082015260a08184039101526104d056fea264697066735822122034839481f88e1aff801b78902159f4d7ed1d3d669e8c0e715a2b7bb7448bcfc464736f6c63430008140033", + "bytecode": "0x6080601f61068f38819003918201601f19168301916001600160401b03831184841017607c57808492602094604052833981010312607857516001600160a01b03811681036078575f8054600160401b600160e01b031916604092831b600160401b600160e01b0316179055516105fe90816100918239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f803560e01c8063073989ff146102e7578063427c1cb61461021c57806361bc221a146101fc57806369a98b2b146100d75763ec3c5a1414610051575f80fd5b346100c5578061006036610404565b86549295919460409390931c6001600160a01b03169291833b156100d3576100a38896928793604051998a9889978896631dba685b60e01b885260048801610553565b03925af180156100c8576100b45750fd5b816100be9161037a565b6100c55780fd5b80fd5b6040513d84823e3d90fd5b8780fd5b50346100c557806100e736610404565b86959291949395546100fb8160070b6104a7565b67ffffffffffffffff199091166001600160401b03919091161780885560401c6001600160a01b0316803b156100d35787878492878388610154888d604051998a9889978896631dba685b60e01b885260048801610553565b03925af19081156101f15788916101dc575b5050303b156101d8578694610190926040519788968796633b0f168560e21b8852600488016104f7565b038183305af16101c3575b50546101a98160070b6104a7565b6001600160401b0316906001600160401b03191617815580f35b816101cd9161037a565b6100c557805f61019b565b8680fd5b816101e69161037a565b6101d857865f610166565b6040513d8a823e3d90fd5b50346100c557806003193601126100c5576020905460070b604051908152f35b50346100c5578061022c36610404565b8654939591949391929160401c6001600160a01b0316803b156100d35787878492878388610272888d604051998a9889978896631dba685b60e01b885260048801610553565b03925af19081156101f15788916102d2575b5050303b156101d85786946102ae926040519788968796633b0f168560e21b8852600488016104f7565b038183305af180156100c8576102c15750f35b816102cb9161037a565b6100c55780f35b816102dc9161037a565b6101d857865f610284565b5034610376576102f636610404565b5f9592919493955461030a8160070b6104a7565b6001600160401b0316906001600160401b031916175f55303b15610376575f9461034992604051978896879663213e0e5b60e11b8852600488016104f7565b038183305af1610363575b5080546101a98160070b6104a7565b61036f91505f9061037a565b5f80610354565b5f80fd5b90601f801991011681019081106001600160401b0382111761039b57604052565b634e487b7160e01b5f52604160045260245ffd5b81601f82011215610376578035906001600160401b03821161039b57604051926103e3601f8401601f19166020018561037a565b8284526020838301011161037657815f926020809301838601378301015290565b9060c0600319830112610376576004356001600160a01b038116810361037657916024356001600160401b0381116103765781610443916004016103af565b916044356001600160401b0381116103765782610462916004016103af565b916064356001600160401b0381116103765781610481916004016103af565b916084359160a435906001600160401b038211610376576104a4916004016103af565b90565b60070b677fffffffffffffff81146104bf5760010190565b634e487b7160e01b5f52601160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9261053290610524610540946104a499979460018060a01b0316875260c0602088015260c08701906104d3565b9085820360408701526104d3565b9083820360608501526104d3565b92608082015260a08184039101526104d3565b969590610100946105966105b7956105886001999661012060208e6105a4988e8060a01b0316815201526101208d01906104d3565b908b820360408d01526104d3565b9089820360608b01526104d3565b91608088015286820360a08801526104d3565b938260c08201528260e0820152015256fea264697066735822122027ff5b78a2d85198548d6c413f6d531c1d1f182e3f3eed3031c541758f7d073164736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f803560e01c8063073989ff146102e7578063427c1cb61461021c57806361bc221a146101fc57806369a98b2b146100d75763ec3c5a1414610051575f80fd5b346100c5578061006036610404565b86549295919460409390931c6001600160a01b03169291833b156100d3576100a38896928793604051998a9889978896631dba685b60e01b885260048801610553565b03925af180156100c8576100b45750fd5b816100be9161037a565b6100c55780fd5b80fd5b6040513d84823e3d90fd5b8780fd5b50346100c557806100e736610404565b86959291949395546100fb8160070b6104a7565b67ffffffffffffffff199091166001600160401b03919091161780885560401c6001600160a01b0316803b156100d35787878492878388610154888d604051998a9889978896631dba685b60e01b885260048801610553565b03925af19081156101f15788916101dc575b5050303b156101d8578694610190926040519788968796633b0f168560e21b8852600488016104f7565b038183305af16101c3575b50546101a98160070b6104a7565b6001600160401b0316906001600160401b03191617815580f35b816101cd9161037a565b6100c557805f61019b565b8680fd5b816101e69161037a565b6101d857865f610166565b6040513d8a823e3d90fd5b50346100c557806003193601126100c5576020905460070b604051908152f35b50346100c5578061022c36610404565b8654939591949391929160401c6001600160a01b0316803b156100d35787878492878388610272888d604051998a9889978896631dba685b60e01b885260048801610553565b03925af19081156101f15788916102d2575b5050303b156101d85786946102ae926040519788968796633b0f168560e21b8852600488016104f7565b038183305af180156100c8576102c15750f35b816102cb9161037a565b6100c55780f35b816102dc9161037a565b6101d857865f610284565b5034610376576102f636610404565b5f9592919493955461030a8160070b6104a7565b6001600160401b0316906001600160401b031916175f55303b15610376575f9461034992604051978896879663213e0e5b60e11b8852600488016104f7565b038183305af1610363575b5080546101a98160070b6104a7565b61036f91505f9061037a565b5f80610354565b5f80fd5b90601f801991011681019081106001600160401b0382111761039b57604052565b634e487b7160e01b5f52604160045260245ffd5b81601f82011215610376578035906001600160401b03821161039b57604051926103e3601f8401601f19166020018561037a565b8284526020838301011161037657815f926020809301838601378301015290565b9060c0600319830112610376576004356001600160a01b038116810361037657916024356001600160401b0381116103765781610443916004016103af565b916044356001600160401b0381116103765782610462916004016103af565b916064356001600160401b0381116103765781610481916004016103af565b916084359160a435906001600160401b038211610376576104a4916004016103af565b90565b60070b677fffffffffffffff81146104bf5760010190565b634e487b7160e01b5f52601160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9261053290610524610540946104a499979460018060a01b0316875260c0602088015260c08701906104d3565b9085820360408701526104d3565b9083820360608501526104d3565b92608082015260a08184039101526104d3565b969590610100946105966105b7956105886001999661012060208e6105a4988e8060a01b0316815201526101208d01906104d3565b908b820360408d01526104d3565b9089820360608b01526104d3565b91608088015286820360a08801526104d3565b938260c08201528260e0820152015256fea264697066735822122027ff5b78a2d85198548d6c413f6d531c1d1f182e3f3eed3031c541758f7d073164736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/testutil/contracts/InterchainSenderCaller.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/testutil/contracts/Reverter.json b/precompiles/testutil/contracts/Reverter.json index c4fb52113..ef0ddcbcd 100644 --- a/precompiles/testutil/contracts/Reverter.json +++ b/precompiles/testutil/contracts/Reverter.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "Reverter", "sourceName": "solidity/precompiles/testutil/contracts/Reverter.sol", "abi": [ @@ -38,8 +38,11 @@ "type": "receive" } ], - "bytecode": "0x6080806040526000805561064b90816100168239f3fe6080604090808252600480361015610022575b505050361561002057600080fd5b005b600091823560e01c90816379388e94146101c3575063c04062260361001257346101bf57816003193601126101bf5761005b8254610383565b80835547303b156101bb57845191631e4e23a560e21b8352838301526024820152828160448183305af190816101a8575b506101a05781549260a881516100a560208301826103d1565b818152602081019161056e83396100da6020845180936100cd83830196879251928391610409565b81010380845201826103d1565b51902091815192602084019560ff60f81b87523060601b6021860152603585015260558401526055835260808301928084106001600160401b0385111761018b5783835251909420929384936001600160a01b0316803b1561018757849184838193633ccfd60b60e01b83525af190811561017e5750610167575b50505b6101628154610383565b815580f35b610170906103a8565b61017b578038610155565b80fd5b513d84823e3d90fd5b8480fd5b604182634e487b7160e01b6000525260246000fd5b509050610158565b6101b4909391936103a8565b913861008c565b8380fd5b5080fd5b92939050346101bb57806003193601126101bb5760a8908184016001600160401b0392858210848311176103705761056e86396024948085359203908635f515610367578051630a97c34560e31b8152308482015293858582816108015afa801561035d57610230578580fd5b3d8087873e61023f81876103d1565b85019382868603126103595785518481116103555786019185601f840112156103555782519161026e836103f2565b9461027b815196876103d1565b8386526020808097019460051b8601019488861161035157868101945b8686106102c457505050505050508301519081116101bb576102ba9201610485565b5038808080808580fd5b855189811161034d5782019083601f19838d03011261034d578351908482018281108c82111761033b578552898301518b8111610337578c8b6103099286010161042c565b825284830151918b8311610337576103288d8c80969581960101610485565b83820152815201950194610298565b8e80fd5b634e487b7160e01b8f5260418752878ffd5b8c80fd5b8a80fd5b8780fd5b8680fd5b82513d88823e3d90fd5b513d85823e3d90fd5b634e487b7160e01b875260418552602487fd5b60001981146103925760010190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381116103bb57604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103bb57604052565b6001600160401b0381116103bb5760051b60200190565b60005b83811061041c5750506000910152565b818101518382015260200161040c565b81601f820112156104805780516001600160401b0381116103bb576040519261045f601f8301601f1916602001856103d1565b818452602082840101116104805761047d9160208085019101610409565b90565b600080fd5b9080601f830112156104805781519161049d836103f2565b926040906104ad825195866103d1565b808552602093848087019260051b8501019381851161048057858101925b8584106104dc575050505050505090565b8351906001600160401b039182811161048057830160609081601f19828803011261048057875193828501858110828211176105585789528a82015190811161048057868b61052d9284010161042c565b8452878101518a85015201519060ff82168203610480578289939288859401528152019301926104cb565b60246000634e487b7160e01b81526041600452fdfe608080604052609790816100118239f3fe60806040526004361015601157600080fd5b6000803560e01c633ccfd60b14602657600080fd5b34605e5780600319360112605e5780808080478181156056575b3390f115604a5780f35b604051903d90823e3d90fd5b506108fc6040565b80fdfea2646970667358221220a84d47d16d94667ccf1fa2c5806581649184eaca8c39fac14a893453228a441064736f6c63430008140033a2646970667358221220752c4206a3f71a423553a97c473d9ee307c1e6c5b9df4acdbe3bbcc8736c257664736f6c63430008140033", - "deployedBytecode": "0x6080604090808252600480361015610022575b505050361561002057600080fd5b005b600091823560e01c90816379388e94146101c3575063c04062260361001257346101bf57816003193601126101bf5761005b8254610383565b80835547303b156101bb57845191631e4e23a560e21b8352838301526024820152828160448183305af190816101a8575b506101a05781549260a881516100a560208301826103d1565b818152602081019161056e83396100da6020845180936100cd83830196879251928391610409565b81010380845201826103d1565b51902091815192602084019560ff60f81b87523060601b6021860152603585015260558401526055835260808301928084106001600160401b0385111761018b5783835251909420929384936001600160a01b0316803b1561018757849184838193633ccfd60b60e01b83525af190811561017e5750610167575b50505b6101628154610383565b815580f35b610170906103a8565b61017b578038610155565b80fd5b513d84823e3d90fd5b8480fd5b604182634e487b7160e01b6000525260246000fd5b509050610158565b6101b4909391936103a8565b913861008c565b8380fd5b5080fd5b92939050346101bb57806003193601126101bb5760a8908184016001600160401b0392858210848311176103705761056e86396024948085359203908635f515610367578051630a97c34560e31b8152308482015293858582816108015afa801561035d57610230578580fd5b3d8087873e61023f81876103d1565b85019382868603126103595785518481116103555786019185601f840112156103555782519161026e836103f2565b9461027b815196876103d1565b8386526020808097019460051b8601019488861161035157868101945b8686106102c457505050505050508301519081116101bb576102ba9201610485565b5038808080808580fd5b855189811161034d5782019083601f19838d03011261034d578351908482018281108c82111761033b578552898301518b8111610337578c8b6103099286010161042c565b825284830151918b8311610337576103288d8c80969581960101610485565b83820152815201950194610298565b8e80fd5b634e487b7160e01b8f5260418752878ffd5b8c80fd5b8a80fd5b8780fd5b8680fd5b82513d88823e3d90fd5b513d85823e3d90fd5b634e487b7160e01b875260418552602487fd5b60001981146103925760010190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381116103bb57604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b038211176103bb57604052565b6001600160401b0381116103bb5760051b60200190565b60005b83811061041c5750506000910152565b818101518382015260200161040c565b81601f820112156104805780516001600160401b0381116103bb576040519261045f601f8301601f1916602001856103d1565b818452602082840101116104805761047d9160208085019101610409565b90565b600080fd5b9080601f830112156104805781519161049d836103f2565b926040906104ad825195866103d1565b808552602093848087019260051b8501019381851161048057858101925b8584106104dc575050505050505090565b8351906001600160401b039182811161048057830160609081601f19828803011261048057875193828501858110828211176105585789528a82015190811161048057868b61052d9284010161042c565b8452878101518a85015201519060ff82168203610480578289939288859401528152019301926104cb565b60246000634e487b7160e01b81526041600452fdfe608080604052609790816100118239f3fe60806040526004361015601157600080fd5b6000803560e01c633ccfd60b14602657600080fd5b34605e5780600319360112605e5780808080478181156056575b3390f115604a5780f35b604051903d90823e3d90fd5b506108fc6040565b80fdfea2646970667358221220a84d47d16d94667ccf1fa2c5806581649184eaca8c39fac14a893453228a441064736f6c63430008140033a2646970667358221220752c4206a3f71a423553a97c473d9ee307c1e6c5b9df4acdbe3bbcc8736c257664736f6c63430008140033", + "bytecode": "0x6080806040525f80556105ba90816100158239f3fe608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c90816379388e941461019b575063c04062260361000f5734610197575f366003190112610197576100545f546104c0565b805f5547303b156101975760405191631e4e23a560e21b8352600483015260248201525f8160448183305af19081610182575b5061017d5780805460a2604051906100a2602082018361034f565b80825260208201906104e382396100d86020604051809382820195518091875e810187838201520301601f19810183528261034f565b5190209060405191602083019160ff60f81b83523060601b6021850152603584015260558301526055825261010e60758361034f565b905190206001600160a01b0316803b1561017a57818091600460405180948193633ccfd60b60e01b83525af1801561016f57610157575b50505b61015281546104c0565b815580f35b816101619161034f565b61016c57805f610145565b80fd5b6040513d84823e3d90fd5b50fd5b610148565b61018f9192505f9061034f565b5f905f610087565b5f80fd5b346101975760403660031901126101975760a290818101918183106001600160401b03841117610330576104e3823980600435920390602435f51561034457604051630a97c34560e31b81523060048201525f816024816108015afa801561034457610205575f80fd5b3d805f833e610214818361034f565b81016040828203126101975781516001600160401b03811161019757820181601f8201121561019757805160208061024b83610370565b610258604051918261034f565b838152019160051b830101918383116101975760208101915b838310610299575050505060208201516001600160401b0381116101975761019792016103dc565b82516001600160401b038111610197578201906040828703601f1901126101975760405190604082018281106001600160401b038211176103305760405260208301516001600160401b038111610197578760206102f992860101610387565b82526040830151916001600160401b03831161019757610321886020809695819601016103dc565b83820152815201920191610271565b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b90601f801991011681019081106001600160401b0382111761033057604052565b6001600160401b0381116103305760051b60200190565b81601f82011215610197578051906001600160401b03821161033057604051926103bb601f8401601f19166020018561034f565b8284526020838301011161019757815f9260208093018386015e8301015290565b9080601f83011215610197578151916103f483610370565b92610402604051948561034f565b80845260208085019160051b830101918383116101975760208101915b83831061042e57505050505090565b82516001600160401b038111610197578201906060828703601f1901126101975760405191606083018381106001600160401b03821117610330576040526020810151906001600160401b03821161019757610491886020606094840101610387565b84526040810151602085015201519060ff8216820361019757826020939260408594015281520192019161041f565b5f1981146104ce5760010190565b634e487b7160e01b5f52601160045260245ffdfe6080806040526092908160108239f3fe608060405260043610156010575f80fd5b5f3560e01c633ccfd60b146022575f80fd5b346058575f3660031901126058575f808080478181156050575b3390f115604557005b6040513d5f823e3d90fd5b506108fc603c565b5f80fdfea264697066735822122011a4419ec661191deb647bc3fd226c524383744a2bdc24cfbbe8bee9df0ffb7b64736f6c634300081a0033a26469706673582212202642ca5601e45038be8285744abfca498fe2834c7df82efcfa6d5918070e721e64736f6c634300081a0033", + "deployedBytecode": "0x608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c90816379388e941461019b575063c04062260361000f5734610197575f366003190112610197576100545f546104c0565b805f5547303b156101975760405191631e4e23a560e21b8352600483015260248201525f8160448183305af19081610182575b5061017d5780805460a2604051906100a2602082018361034f565b80825260208201906104e382396100d86020604051809382820195518091875e810187838201520301601f19810183528261034f565b5190209060405191602083019160ff60f81b83523060601b6021850152603584015260558301526055825261010e60758361034f565b905190206001600160a01b0316803b1561017a57818091600460405180948193633ccfd60b60e01b83525af1801561016f57610157575b50505b61015281546104c0565b815580f35b816101619161034f565b61016c57805f610145565b80fd5b6040513d84823e3d90fd5b50fd5b610148565b61018f9192505f9061034f565b5f905f610087565b5f80fd5b346101975760403660031901126101975760a290818101918183106001600160401b03841117610330576104e3823980600435920390602435f51561034457604051630a97c34560e31b81523060048201525f816024816108015afa801561034457610205575f80fd5b3d805f833e610214818361034f565b81016040828203126101975781516001600160401b03811161019757820181601f8201121561019757805160208061024b83610370565b610258604051918261034f565b838152019160051b830101918383116101975760208101915b838310610299575050505060208201516001600160401b0381116101975761019792016103dc565b82516001600160401b038111610197578201906040828703601f1901126101975760405190604082018281106001600160401b038211176103305760405260208301516001600160401b038111610197578760206102f992860101610387565b82526040830151916001600160401b03831161019757610321886020809695819601016103dc565b83820152815201920191610271565b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b90601f801991011681019081106001600160401b0382111761033057604052565b6001600160401b0381116103305760051b60200190565b81601f82011215610197578051906001600160401b03821161033057604051926103bb601f8401601f19166020018561034f565b8284526020838301011161019757815f9260208093018386015e8301015290565b9080601f83011215610197578151916103f483610370565b92610402604051948561034f565b80845260208085019160051b830101918383116101975760208101915b83831061042e57505050505090565b82516001600160401b038111610197578201906060828703601f1901126101975760405191606083018381106001600160401b03821117610330576040526020810151906001600160401b03821161019757610491886020606094840101610387565b84526040810151602085015201519060ff8216820361019757826020939260408594015281520192019161041f565b5f1981146104ce5760010190565b634e487b7160e01b5f52601160045260245ffdfe6080806040526092908160108239f3fe608060405260043610156010575f80fd5b5f3560e01c633ccfd60b146022575f80fd5b346058575f3660031901126058575f808080478181156050575b3390f115604557005b6040513d5f823e3d90fd5b506108fc603c565b5f80fdfea264697066735822122011a4419ec661191deb647bc3fd226c524383744a2bdc24cfbbe8bee9df0ffb7b64736f6c634300081a0033a26469706673582212202642ca5601e45038be8285744abfca498fe2834c7df82efcfa6d5918070e721e64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/testutil/contracts/Reverter.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/testutil/contracts/StakingReverter.json b/precompiles/testutil/contracts/StakingReverter.json index ff68dce37..c5c2ef2e9 100644 --- a/precompiles/testutil/contracts/StakingReverter.json +++ b/precompiles/testutil/contracts/StakingReverter.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "StakingReverter", "sourceName": "solidity/precompiles/testutil/contracts/StakingReverter.sol", "abi": [ @@ -243,8 +243,11 @@ "type": "function" } ], - "bytecode": "0x60808060405260008055610db890816100168239f3fe608080604052600436101561001357600080fd5b60003560e01c9081634d9db92b14610938575080634e5a8fe5146108c757806352fce7b11461083f578063668f452b14610714578063922a4b671461059c578063cbc367d41461012b5763f66013d71461006c57600080fd5b34610112576020366003190112610112576004356001600160401b0381116101125760206100a16100ca923690600401610b89565b6040516353266bbb60e01b81523060048201526060602482015293849283926064840191610cf2565b600a6044830152038160006108005af1801561011f576100e957600080fd5b6020813d8211610117575b8161010160209383610cd1565b810103126101125761011290610d13565b600080fd5b3d91506100f4565b6040513d6000823e3d90fd5b34610112576040366003190112610112576024356001600160a01b03811681036101125760405161015b81610c9a565b6060815260606020820152600060408201526000606082015260006080820152600060a082015260405161018e81610cb6565b6060815260606020820152606060408201526060808201526060608082015260c0820152600060e0820152600061010082015260006101208201526000610140820152906000905b60043582106103185782604051906020825261021961020382516101606020860152610180850190610c0c565b6020830151848203601f19016040860152610c0c565b906040810151151560608401526060810151916004831015610302576102ce6101409185946080860152608084015160a086015260a084015160c086015260c084015190601f198682030160e087015260806102bd6102ab610299610287865160a0875260a0870190610c0c565b60208701518682036020880152610c0c565b60408601518582036040870152610c0c565b60608501518482036060860152610c0c565b920151906080818403910152610c0c565b9160e081015160070b61010085015261010081015160070b6101208501526101208101518285015201516101608301520390f35b634e487b7160e01b600052602160045260246000fd5b60405163111d9dbd60e11b81526001600160a01b0382166004820152919250906000816024816108005afa801561011f57600090610362575b61035c915092610c31565b906101d6565b503d806000833e6103738183610cd1565b6020828281010312610112578151906001600160401b03821161011257610160828401828501031261011257604051916103ac83610c9a565b808401516001600160401b038111610112576103cf908386019083870101610d20565b8352602081850101516001600160401b038111610112576103f7908386019083870101610d20565b602084015261040a604082860101610d13565b60408401526060818501015160048110156101125760608401528381016080818101519085015260a0808201519085015260c00151936001600160401b0385116101125760a0858383010184830103126101125760405161046a81610cb6565b8583830101516001600160401b038111610112576104919085840190888686010101610d20565b81526020868484010101516001600160401b038111610112576104bd9085840190888686010101610d20565b60208201526040868484010101516001600160401b038111610112576104ec9085840190888686010101610d20565b60408201526060868484010101516001600160401b0381116101125761051b9085840190888686010101610d20565b6060820152608086848401010151936001600160401b0385116101125761035c9661014095610551928501918686010101610d20565b608082015260c085015261056960e083830101610d74565b60e085015261057d61010083830101610d74565b6101008501520161012081810151908401520151610140820152610351565b34610112576105aa36610bb6565b91604051916353266bbb60e01b8084523060048501526024916060838601526105d7606486018783610cf2565b93600a604487015260209586818061080098038160008a5af1801561011f576106e0575b5091859391949260005b81811061067c57505060009061063760609596604051998a978896879586523060048701528501526064840191610cf2565b600a604483015203925af1801561011f5761064e57005b81813d8311610675575b6106628183610cd1565b810103126101125761067390610d13565b005b503d610658565b90919395929450303b156101125760405163f66013d760e01b8152600481018890526106c59190600081806106b48a82018e8a610cf2565b038183305af16106d1575b50610c31565b90869492959391610605565b6106da90610c56565b896106bf565b8681813d831161070d575b6106f58183610cd1565b810103126101125761070690610d13565b50876105fb565b503d6106eb565b3461011257602080600319360112610112576004356001600160401b0380821161011257600061074b610788933690600401610b89565b828660405161075981610c7f565b606081520152604051948592839263120bba7360e11b8452306004850152604060248501526044840191610cf2565b03816108005afa90811561011f576000926000926107d2575b505060405192839283526040818401526107c682516040808601526080850190610c0c565b91015160608301520390f35b915091503d806000833e6107e68183610cd1565b81016040828203126101125781519184810151908482116101125701604081830312610112576040519361081985610c7f565b815190811161011257859261082f918301610d20565b84520151838301529083806107a1565b346101125761084d36610bb6565b61085b600093929354610c31565b60005560005b82811061086a57005b303b156101125760405163f66013d760e01b815260206004820152906000828061089860248201878a610cf2565b038183305af191821561011f576108b3926108b85750610c31565b610861565b6108c190610c56565b856106bf565b34610112576108d536610bb6565b91906108e2600054610c31565b60005560005b8281106108f157005b303b156101125760405163f66013d760e01b815260206004820152610933919060008180610923602482018a89610cf2565b038183305af16108b85750610c31565b6108e8565b34610112576060366003190112610112576044356001600160401b03811161011257610968903690600401610b89565b6353266bbb60e01b8352306004840152606060248401529160208180610992606482018787610cf2565b600a6044830152038160006108005af1801561011f57610b50575b5060005b6004358110610a23576040516353266bbb60e01b815230600482015260606024820152602081806109e6606482018888610cf2565b600a6044830152038160006108005af1801561011f57610a0257005b6020813d602011610a1b575b8161066260209383610cd1565b3d9150610a0e565b90303b156101125760405163f66013d760e01b81526020600482015260008180610a51602482018887610cf2565b038183305af19081610b41575b50610b37576040516353266bbb60e01b81523060048201526060602482015260208180610a8f606482018887610cf2565b600a6044830152038160006108005af1801561011f57610afe575b5060005b6024358110610ac7575090610ac290610c31565b6109b1565b303b156101125760405163f66013d760e01b815260206004820152610af9919060008180610923602482018a89610cf2565b610aae565b6020813d602011610b2f575b81610b1760209383610cd1565b8101031261011257610b2890610d13565b5083610aaa565b3d9150610b0a565b90610ac290610c31565b610b4a90610c56565b84610a5e565b6020813d602011610b81575b81610b6960209383610cd1565b8101031261011257610b7a90610d13565b50826109ad565b3d9150610b5c565b9181601f84011215610112578235916001600160401b038311610112576020838186019501011161011257565b9060406003198301126101125760043591602435906001600160401b03821161011257610be591600401610b89565b9091565b60005b838110610bfc5750506000910152565b8181015183820152602001610bec565b90602091610c2581518092818552858086019101610be9565b601f01601f1916010190565b6000198114610c405760010190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038111610c6957604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117610c6957604052565b61016081019081106001600160401b03821117610c6957604052565b60a081019081106001600160401b03821117610c6957604052565b90601f801991011681019081106001600160401b03821117610c6957604052565b908060209392818452848401376000828201840152601f01601f1916010190565b5190811515820361011257565b81601f820112156101125780516001600160401b038111610c695760405192610d53601f8301601f191660200185610cd1565b8184526020828401011161011257610d719160208085019101610be9565b90565b51908160070b82036101125756fea26469706673582212204b99277ce78a90870d2a3dd8b1cfe0c936d27451384c2c734af37693a846925564736f6c63430008140033", - "deployedBytecode": "0x608080604052600436101561001357600080fd5b60003560e01c9081634d9db92b14610938575080634e5a8fe5146108c757806352fce7b11461083f578063668f452b14610714578063922a4b671461059c578063cbc367d41461012b5763f66013d71461006c57600080fd5b34610112576020366003190112610112576004356001600160401b0381116101125760206100a16100ca923690600401610b89565b6040516353266bbb60e01b81523060048201526060602482015293849283926064840191610cf2565b600a6044830152038160006108005af1801561011f576100e957600080fd5b6020813d8211610117575b8161010160209383610cd1565b810103126101125761011290610d13565b600080fd5b3d91506100f4565b6040513d6000823e3d90fd5b34610112576040366003190112610112576024356001600160a01b03811681036101125760405161015b81610c9a565b6060815260606020820152600060408201526000606082015260006080820152600060a082015260405161018e81610cb6565b6060815260606020820152606060408201526060808201526060608082015260c0820152600060e0820152600061010082015260006101208201526000610140820152906000905b60043582106103185782604051906020825261021961020382516101606020860152610180850190610c0c565b6020830151848203601f19016040860152610c0c565b906040810151151560608401526060810151916004831015610302576102ce6101409185946080860152608084015160a086015260a084015160c086015260c084015190601f198682030160e087015260806102bd6102ab610299610287865160a0875260a0870190610c0c565b60208701518682036020880152610c0c565b60408601518582036040870152610c0c565b60608501518482036060860152610c0c565b920151906080818403910152610c0c565b9160e081015160070b61010085015261010081015160070b6101208501526101208101518285015201516101608301520390f35b634e487b7160e01b600052602160045260246000fd5b60405163111d9dbd60e11b81526001600160a01b0382166004820152919250906000816024816108005afa801561011f57600090610362575b61035c915092610c31565b906101d6565b503d806000833e6103738183610cd1565b6020828281010312610112578151906001600160401b03821161011257610160828401828501031261011257604051916103ac83610c9a565b808401516001600160401b038111610112576103cf908386019083870101610d20565b8352602081850101516001600160401b038111610112576103f7908386019083870101610d20565b602084015261040a604082860101610d13565b60408401526060818501015160048110156101125760608401528381016080818101519085015260a0808201519085015260c00151936001600160401b0385116101125760a0858383010184830103126101125760405161046a81610cb6565b8583830101516001600160401b038111610112576104919085840190888686010101610d20565b81526020868484010101516001600160401b038111610112576104bd9085840190888686010101610d20565b60208201526040868484010101516001600160401b038111610112576104ec9085840190888686010101610d20565b60408201526060868484010101516001600160401b0381116101125761051b9085840190888686010101610d20565b6060820152608086848401010151936001600160401b0385116101125761035c9661014095610551928501918686010101610d20565b608082015260c085015261056960e083830101610d74565b60e085015261057d61010083830101610d74565b6101008501520161012081810151908401520151610140820152610351565b34610112576105aa36610bb6565b91604051916353266bbb60e01b8084523060048501526024916060838601526105d7606486018783610cf2565b93600a604487015260209586818061080098038160008a5af1801561011f576106e0575b5091859391949260005b81811061067c57505060009061063760609596604051998a978896879586523060048701528501526064840191610cf2565b600a604483015203925af1801561011f5761064e57005b81813d8311610675575b6106628183610cd1565b810103126101125761067390610d13565b005b503d610658565b90919395929450303b156101125760405163f66013d760e01b8152600481018890526106c59190600081806106b48a82018e8a610cf2565b038183305af16106d1575b50610c31565b90869492959391610605565b6106da90610c56565b896106bf565b8681813d831161070d575b6106f58183610cd1565b810103126101125761070690610d13565b50876105fb565b503d6106eb565b3461011257602080600319360112610112576004356001600160401b0380821161011257600061074b610788933690600401610b89565b828660405161075981610c7f565b606081520152604051948592839263120bba7360e11b8452306004850152604060248501526044840191610cf2565b03816108005afa90811561011f576000926000926107d2575b505060405192839283526040818401526107c682516040808601526080850190610c0c565b91015160608301520390f35b915091503d806000833e6107e68183610cd1565b81016040828203126101125781519184810151908482116101125701604081830312610112576040519361081985610c7f565b815190811161011257859261082f918301610d20565b84520151838301529083806107a1565b346101125761084d36610bb6565b61085b600093929354610c31565b60005560005b82811061086a57005b303b156101125760405163f66013d760e01b815260206004820152906000828061089860248201878a610cf2565b038183305af191821561011f576108b3926108b85750610c31565b610861565b6108c190610c56565b856106bf565b34610112576108d536610bb6565b91906108e2600054610c31565b60005560005b8281106108f157005b303b156101125760405163f66013d760e01b815260206004820152610933919060008180610923602482018a89610cf2565b038183305af16108b85750610c31565b6108e8565b34610112576060366003190112610112576044356001600160401b03811161011257610968903690600401610b89565b6353266bbb60e01b8352306004840152606060248401529160208180610992606482018787610cf2565b600a6044830152038160006108005af1801561011f57610b50575b5060005b6004358110610a23576040516353266bbb60e01b815230600482015260606024820152602081806109e6606482018888610cf2565b600a6044830152038160006108005af1801561011f57610a0257005b6020813d602011610a1b575b8161066260209383610cd1565b3d9150610a0e565b90303b156101125760405163f66013d760e01b81526020600482015260008180610a51602482018887610cf2565b038183305af19081610b41575b50610b37576040516353266bbb60e01b81523060048201526060602482015260208180610a8f606482018887610cf2565b600a6044830152038160006108005af1801561011f57610afe575b5060005b6024358110610ac7575090610ac290610c31565b6109b1565b303b156101125760405163f66013d760e01b815260206004820152610af9919060008180610923602482018a89610cf2565b610aae565b6020813d602011610b2f575b81610b1760209383610cd1565b8101031261011257610b2890610d13565b5083610aaa565b3d9150610b0a565b90610ac290610c31565b610b4a90610c56565b84610a5e565b6020813d602011610b81575b81610b6960209383610cd1565b8101031261011257610b7a90610d13565b50826109ad565b3d9150610b5c565b9181601f84011215610112578235916001600160401b038311610112576020838186019501011161011257565b9060406003198301126101125760043591602435906001600160401b03821161011257610be591600401610b89565b9091565b60005b838110610bfc5750506000910152565b8181015183820152602001610bec565b90602091610c2581518092818552858086019101610be9565b601f01601f1916010190565b6000198114610c405760010190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038111610c6957604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117610c6957604052565b61016081019081106001600160401b03821117610c6957604052565b60a081019081106001600160401b03821117610c6957604052565b90601f801991011681019081106001600160401b03821117610c6957604052565b908060209392818452848401376000828201840152601f01601f1916010190565b5190811515820361011257565b81601f820112156101125780516001600160401b038111610c695760405192610d53601f8301601f191660200185610cd1565b8184526020828401011161011257610d719160208085019101610be9565b90565b51908160070b82036101125756fea26469706673582212204b99277ce78a90870d2a3dd8b1cfe0c936d27451384c2c734af37693a846925564736f6c63430008140033", + "bytecode": "0x6080806040525f8055610cd490816100158239f3fe6080806040526004361015610012575f80fd5b5f3560e01c9081634d9db92b146108be575080634e5a8fe51461084557806352fce7b1146107c4578063668f452b1461068c578063922a4b6714610529578063cbc367d4146101255763f66013d714610069575f80fd5b3461010e57602036600319011261010e576004356001600160401b03811161010e57602061009e6100c7923690600401610ae1565b6040516353266bbb60e01b81523060048201526060602482015293849283926064840191610bf9565b600a604483015203815f6108005af1801561011a576100e4575f80fd5b6020813d602011610112575b816100fd60209383610bcb565b8101031261010e5761010e90610bec565b5f80fd5b3d91506100f0565b6040513d5f823e3d90fd5b3461010e57604036600319011261010e576004356024356001600160a01b0381169081900361010e579060405161015b81610b94565b60608152606060208201525f60408201525f60608201525f60808201525f60a082015260405161018a81610bb0565b6060815260606020820152606060408201526060808201526060608082015260c08201525f60e08201525f6101008201525f6101208201525f610140820152915f915b80831061030b5783604051906020825261020e6101f882516101606020860152610180850190610b41565b6020830151848203601f19016040860152610b41565b9060408101511515606084015260608101519160048310156102f7576102c36101409185946080860152608084015160a086015260a084015160c086015260c084015190601f198682030160e087015260806102b26102a061028e61027c865160a0875260a0870190610b41565b60208701518682036020880152610b41565b60408601518582036040870152610b41565b60608501518482036060860152610b41565b920151906080818403910152610b41565b9160e081015160070b61010085015261010081015160070b6101208501526101208101518285015201516101608301520390f35b634e487b7160e01b5f52602160045260245ffd5b9091925060405163111d9dbd60e11b81528260048201525f816024816108005afa801561011a575f90610346575b60019150930191906101cd565b503d805f833e6103568183610bcb565b81019060208183031261010e578051906001600160401b03821161010e57016101608183031261010e576040519061038d82610b94565b80516001600160401b03811161010e57836103a9918301610c3b565b825260208101516001600160401b03811161010e57836103ca918301610c3b565b60208301526103db60408201610bec565b60408301526060810151600481101561010e5760608301526080810151608083015260a081015160a083015260c08101516001600160401b03811161010e5781019060a08285031261010e5760405161043381610bb0565b82516001600160401b03811161010e578561044f918501610c3b565b815260208301516001600160401b03811161010e5785610470918501610c3b565b602082015260408301516001600160401b03811161010e5785610494918501610c3b565b604082015260608301516001600160401b03811161010e57856104b8918501610c3b565b60608201526080830151926001600160401b03841161010e57600195610140946104e29201610c3b565b608082015260c08401526104f860e08201610c90565b60e084015261050a6101008201610c90565b6101008401526101208101516101208401520151610140820152610339565b3461010e5761053736610b0e565b916040516353266bbb60e01b81523060048201526060602482015260208180610564606482018888610bf9565b600a604483015203815f6108005af1801561011a57610655575b505f5b818110610603576040516353266bbb60e01b815230600482015260606024820152602081806105b4606482018989610bf9565b600a604483015203815f6108005af1801561011a576105cf57005b6020813d6020116105fb575b816105e860209383610bcb565b8101031261010e576105f990610bec565b005b3d91506105db565b303b1561010e5760405163f66013d760e01b815260206004820152600191905f8180610633602482018a8a610bf9565b038183305af1610645575b5001610581565b5f61064f91610bcb565b8561063e565b6020813d602011610684575b8161066e60209383610bcb565b8101031261010e5761067f90610bec565b61057e565b3d9150610661565b3461010e57602036600319011261010e576004356001600160401b03811161010e575f6106c06106fe923690600401610ae1565b8260206040516106cf81610b65565b606081520152604051938492839263120bba7360e11b8452306004850152604060248501526044840191610bf9565b03816108005afa90811561011a575f905f92610748575b50604051918291825260406020830152602061073c82516040808601526080850190610b41565b91015160608301520390f35b9150503d805f833e61075a8183610bcb565b81019060408183031261010e578051906020810151906001600160401b03821161010e57019160408382031261010e576040519261079784610b65565b80516001600160401b03811161010e576020926107b5918301610c3b565b84520151602083015282610715565b3461010e576107d236610b0e565b6107df5f93929354610c19565b5f555f5b8281106107ec57005b303b1561010e5760405163f66013d760e01b815260206004820152905f828061081960248201878a610bf9565b038183305af191821561011a57600192610835575b50016107e3565b5f61083f91610bcb565b8561082e565b3461010e5761085336610b0e565b919061085f5f54610c19565b5f555f5b82811061086c57005b303b1561010e5760405163f66013d760e01b815260206004820152600191905f818061089c602482018a89610bf9565b038183305af16108ae575b5001610863565b5f6108b891610bcb565b856108a7565b3461010e57606036600319011261010e57602435906004356044356001600160401b03811161010e576108f5903690600401610ae1565b6353266bbb60e01b84523060048501526060602485015293909260208180610921606482018989610bf9565b600a604483015203815f6108005af1801561011a57610aaa575b505f5b828110610971576040516353266bbb60e01b815230600482015260606024820152602081806105b4606482018a8a610bf9565b303b1561010e5760405163f66013d760e01b8152602060048201525f818061099d602482018a8a610bf9565b038183305af19081610a9a575b50610a92576040516353266bbb60e01b815230600482015260606024820152602081806109db606482018a8a610bf9565b600a604483015203815f6108005af1801561011a57610a5c575b505f5b828110610a0a57506001905b0161093e565b303b1561010e5760405163f66013d760e01b815260206004820152600191905f8180610a3a602482018c8c610bf9565b038183305af1610a4c575b50016109f8565b5f610a5691610bcb565b87610a45565b6020813d8211610a8a575b81610a7460209383610bcb565b8101031261010e57610a8590610bec565b6109f5565b3d9150610a67565b600190610a04565b5f610aa491610bcb565b866109aa565b6020813d602011610ad9575b81610ac360209383610bcb565b8101031261010e57610ad490610bec565b61093b565b3d9150610ab6565b9181601f8401121561010e578235916001600160401b03831161010e576020838186019501011161010e57565b90604060031983011261010e5760043591602435906001600160401b03821161010e57610b3d91600401610ae1565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b604081019081106001600160401b03821117610b8057604052565b634e487b7160e01b5f52604160045260245ffd5b61016081019081106001600160401b03821117610b8057604052565b60a081019081106001600160401b03821117610b8057604052565b90601f801991011681019081106001600160401b03821117610b8057604052565b5190811515820361010e57565b908060209392818452848401375f828201840152601f01601f1916010190565b5f198114610c275760010190565b634e487b7160e01b5f52601160045260245ffd5b81601f8201121561010e578051906001600160401b038211610b805760405192610c6f601f8401601f191660200185610bcb565b8284526020838301011161010e57815f9260208093018386015e8301015290565b51908160070b820361010e5756fea26469706673582212208c62a66bef5023707633296c977f66bc483de18b59b4c47fe899964209104c1964736f6c634300081a0033", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c9081634d9db92b146108be575080634e5a8fe51461084557806352fce7b1146107c4578063668f452b1461068c578063922a4b6714610529578063cbc367d4146101255763f66013d714610069575f80fd5b3461010e57602036600319011261010e576004356001600160401b03811161010e57602061009e6100c7923690600401610ae1565b6040516353266bbb60e01b81523060048201526060602482015293849283926064840191610bf9565b600a604483015203815f6108005af1801561011a576100e4575f80fd5b6020813d602011610112575b816100fd60209383610bcb565b8101031261010e5761010e90610bec565b5f80fd5b3d91506100f0565b6040513d5f823e3d90fd5b3461010e57604036600319011261010e576004356024356001600160a01b0381169081900361010e579060405161015b81610b94565b60608152606060208201525f60408201525f60608201525f60808201525f60a082015260405161018a81610bb0565b6060815260606020820152606060408201526060808201526060608082015260c08201525f60e08201525f6101008201525f6101208201525f610140820152915f915b80831061030b5783604051906020825261020e6101f882516101606020860152610180850190610b41565b6020830151848203601f19016040860152610b41565b9060408101511515606084015260608101519160048310156102f7576102c36101409185946080860152608084015160a086015260a084015160c086015260c084015190601f198682030160e087015260806102b26102a061028e61027c865160a0875260a0870190610b41565b60208701518682036020880152610b41565b60408601518582036040870152610b41565b60608501518482036060860152610b41565b920151906080818403910152610b41565b9160e081015160070b61010085015261010081015160070b6101208501526101208101518285015201516101608301520390f35b634e487b7160e01b5f52602160045260245ffd5b9091925060405163111d9dbd60e11b81528260048201525f816024816108005afa801561011a575f90610346575b60019150930191906101cd565b503d805f833e6103568183610bcb565b81019060208183031261010e578051906001600160401b03821161010e57016101608183031261010e576040519061038d82610b94565b80516001600160401b03811161010e57836103a9918301610c3b565b825260208101516001600160401b03811161010e57836103ca918301610c3b565b60208301526103db60408201610bec565b60408301526060810151600481101561010e5760608301526080810151608083015260a081015160a083015260c08101516001600160401b03811161010e5781019060a08285031261010e5760405161043381610bb0565b82516001600160401b03811161010e578561044f918501610c3b565b815260208301516001600160401b03811161010e5785610470918501610c3b565b602082015260408301516001600160401b03811161010e5785610494918501610c3b565b604082015260608301516001600160401b03811161010e57856104b8918501610c3b565b60608201526080830151926001600160401b03841161010e57600195610140946104e29201610c3b565b608082015260c08401526104f860e08201610c90565b60e084015261050a6101008201610c90565b6101008401526101208101516101208401520151610140820152610339565b3461010e5761053736610b0e565b916040516353266bbb60e01b81523060048201526060602482015260208180610564606482018888610bf9565b600a604483015203815f6108005af1801561011a57610655575b505f5b818110610603576040516353266bbb60e01b815230600482015260606024820152602081806105b4606482018989610bf9565b600a604483015203815f6108005af1801561011a576105cf57005b6020813d6020116105fb575b816105e860209383610bcb565b8101031261010e576105f990610bec565b005b3d91506105db565b303b1561010e5760405163f66013d760e01b815260206004820152600191905f8180610633602482018a8a610bf9565b038183305af1610645575b5001610581565b5f61064f91610bcb565b8561063e565b6020813d602011610684575b8161066e60209383610bcb565b8101031261010e5761067f90610bec565b61057e565b3d9150610661565b3461010e57602036600319011261010e576004356001600160401b03811161010e575f6106c06106fe923690600401610ae1565b8260206040516106cf81610b65565b606081520152604051938492839263120bba7360e11b8452306004850152604060248501526044840191610bf9565b03816108005afa90811561011a575f905f92610748575b50604051918291825260406020830152602061073c82516040808601526080850190610b41565b91015160608301520390f35b9150503d805f833e61075a8183610bcb565b81019060408183031261010e578051906020810151906001600160401b03821161010e57019160408382031261010e576040519261079784610b65565b80516001600160401b03811161010e576020926107b5918301610c3b565b84520151602083015282610715565b3461010e576107d236610b0e565b6107df5f93929354610c19565b5f555f5b8281106107ec57005b303b1561010e5760405163f66013d760e01b815260206004820152905f828061081960248201878a610bf9565b038183305af191821561011a57600192610835575b50016107e3565b5f61083f91610bcb565b8561082e565b3461010e5761085336610b0e565b919061085f5f54610c19565b5f555f5b82811061086c57005b303b1561010e5760405163f66013d760e01b815260206004820152600191905f818061089c602482018a89610bf9565b038183305af16108ae575b5001610863565b5f6108b891610bcb565b856108a7565b3461010e57606036600319011261010e57602435906004356044356001600160401b03811161010e576108f5903690600401610ae1565b6353266bbb60e01b84523060048501526060602485015293909260208180610921606482018989610bf9565b600a604483015203815f6108005af1801561011a57610aaa575b505f5b828110610971576040516353266bbb60e01b815230600482015260606024820152602081806105b4606482018a8a610bf9565b303b1561010e5760405163f66013d760e01b8152602060048201525f818061099d602482018a8a610bf9565b038183305af19081610a9a575b50610a92576040516353266bbb60e01b815230600482015260606024820152602081806109db606482018a8a610bf9565b600a604483015203815f6108005af1801561011a57610a5c575b505f5b828110610a0a57506001905b0161093e565b303b1561010e5760405163f66013d760e01b815260206004820152600191905f8180610a3a602482018c8c610bf9565b038183305af1610a4c575b50016109f8565b5f610a5691610bcb565b87610a45565b6020813d8211610a8a575b81610a7460209383610bcb565b8101031261010e57610a8590610bec565b6109f5565b3d9150610a67565b600190610a04565b5f610aa491610bcb565b866109aa565b6020813d602011610ad9575b81610ac360209383610bcb565b8101031261010e57610ad490610bec565b61093b565b3d9150610ab6565b9181601f8401121561010e578235916001600160401b03831161010e576020838186019501011161010e57565b90604060031983011261010e5760043591602435906001600160401b03821161010e57610b3d91600401610ae1565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b604081019081106001600160401b03821117610b8057604052565b634e487b7160e01b5f52604160045260245ffd5b61016081019081106001600160401b03821117610b8057604052565b60a081019081106001600160401b03821117610b8057604052565b90601f801991011681019081106001600160401b03821117610b8057604052565b5190811515820361010e57565b908060209392818452848401375f828201840152601f01601f1916010190565b5f198114610c275760010190565b634e487b7160e01b5f52601160045260245ffd5b81601f8201121561010e578051906001600160401b038211610b805760405192610c6f601f8401601f191660200185610bcb565b8284526020838301011161010e57815f9260208093018386015e8301015290565b51908160070b820361010e5756fea26469706673582212208c62a66bef5023707633296c977f66bc483de18b59b4c47fe899964209104c1964736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/precompiles/testutil/contracts/StakingReverter.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/testutil/errors.go b/precompiles/testutil/errors.go index 3e32090c7..dddc04907 100644 --- a/precompiles/testutil/errors.go +++ b/precompiles/testutil/errors.go @@ -1,11 +1,15 @@ package testutil import ( + "errors" "fmt" "strings" + "testing" abci "github.com/cometbft/cometbft/abci/types" + "github.com/stretchr/testify/require" + cmn "github.com/cosmos/evm/precompiles/common" evmtypes "github.com/cosmos/evm/x/vm/types" ) @@ -31,3 +35,20 @@ func CheckEthereumTxFailed(ethRes *evmtypes.MsgEthereumTxResponse) (string, bool reason := ethRes.VmError return reason, reason != "" } + +// RequireExactError asserts exact error equality for expected precompile reverts. +// If both errors carry revert data, it compares ABI-encoded revert bytes exactly. +func RequireExactError(t *testing.T, got error, want error) { + t.Helper() + require.Error(t, got) + require.NotNil(t, want) + + var gotCarrier cmn.RevertDataCarrier + var wantCarrier cmn.RevertDataCarrier + if errors.As(got, &gotCarrier) && errors.As(want, &wantCarrier) { + require.Equal(t, wantCarrier.RevertData(), gotCarrier.RevertData()) + return + } + + require.EqualError(t, got, want.Error()) +} diff --git a/precompiles/testutil/logs.go b/precompiles/testutil/logs.go index c3837ec30..984097877 100644 --- a/precompiles/testutil/logs.go +++ b/precompiles/testutil/logs.go @@ -76,6 +76,10 @@ type LogCheckArgs struct { ABIEvents map[string]abi.Event // ErrContains is the error message that is expected to be contained in the transaction response. ErrContains string + // ErrExact is an optional exact-match error to validate revert payload bytes (typically Solidity custom errors). + // + // If set, integration test error checking will prefer this exact check over ErrContains. + ErrExact error // ExpEvents are the events which are expected to be emitted. ExpEvents []string // ExpPass is whether the transaction is expected to pass or not. @@ -107,6 +111,12 @@ func (l LogCheckArgs) WithErrContains(errContains string, printArgs ...interface return l } +// WithErrExact sets the ErrExact field of LogCheckArgs. +func (l LogCheckArgs) WithErrExact(errExact error) LogCheckArgs { + l.ErrExact = errExact + return l +} + // WithErrNested append the ErrContains field of LogCheckArgs. // If any printArgs are provided, they are used to format the error message. func (l LogCheckArgs) WithErrNested(errContains string, printArgs ...interface{}) LogCheckArgs { diff --git a/precompiles/werc20/IWERC20.sol b/precompiles/werc20/IWERC20.sol index b369abe00..827462192 100644 --- a/precompiles/werc20/IWERC20.sol +++ b/precompiles/werc20/IWERC20.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity >=0.8.18; +pragma solidity >=0.8.20; -import "./../erc20/IERC20Metadata.sol"; +import "../erc20/ERC20I.sol"; /** * @author Evmos Team * @title Wrapped ERC20 Interface * @dev Interface for representing the native EVM token as a wrapped ERC20 standard. */ -interface IWERC20 is IERC20Metadata { +interface IWERC20 is ERC20I { /// @dev Emitted when the native tokens are deposited in exchange for the wrapped ERC20. /// @param dst The account for which the deposit is made. /// @param wad The amount of native tokens deposited. diff --git a/precompiles/werc20/abi.json b/precompiles/werc20/abi.json index 3f97434e8..506d88088 100644 --- a/precompiles/werc20/abi.json +++ b/precompiles/werc20/abi.json @@ -1,4 +1,263 @@ [ + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "ABISetupFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "ERC20CannotReceiveFunds", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "eventKind", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EventEmitFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "bad", + "type": "string" + } + ], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "amount", + "type": "string" + } + ], + "name": "InvalidAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "height", + "type": "string" + } + ], + "name": "InvalidHeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + } + ], + "name": "InvalidNumberOfArgs", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "pubkey", + "type": "string" + } + ], + "name": "InvalidPubkey", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "got", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "InvalidPubkeySize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msgMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "MsgServerFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "queryMethod", + "type": "string" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "QueryFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "msgSender", + "type": "address" + }, + { + "internalType": "address", + "name": "requester", + "type": "address" + } + ], + "name": "RequesterIsNotMsgSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "methodName", + "type": "string" + } + ], + "name": "UnknownMethod", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -124,7 +383,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -226,7 +485,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -255,7 +514,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], diff --git a/precompiles/werc20/testdata/WEVMOS9TestCaller.json b/precompiles/werc20/testdata/WEVMOS9TestCaller.json index dfcd6ca3d..9c096ee79 100644 --- a/precompiles/werc20/testdata/WEVMOS9TestCaller.json +++ b/precompiles/werc20/testdata/WEVMOS9TestCaller.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "WEVMOS9TestCaller", "sourceName": "solidity/precompiles/werc20/testdata/WEVMOS9TestCaller.sol", "abi": [ @@ -72,8 +72,22 @@ "type": "function" } ], - "bytecode": "0x60a03461007357601f6102b138819003918201601f19168301916001600160401b038311848410176100785780849260209460405283398101031261007357516001600160a01b03811681036100735760805260008055604051610222908161008f82396080518181816058015260e40152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604081815260048036101561001557600080fd5b600092833560e01c9182635dab6f8c146100a7575050806361bc221a1461008b57637cf5b4fc1461004557600080fd5b34610087578160031936011261008757517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b5034610087578160031936011261008757602091549051908152f35b90928092506003193601126101b557803580151581036101b1576024359384151585036101ad578554600019949085811461019a576001018755867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156100875785848092630d0e30db60e41b825234905af1801561019057610162575b505061014a57835490811561014f575001825561014a5780f35b6101b9565b634e487b7160e01b855260119052602484fd5b67ffffffffffffffff829793971161017d5752933880610130565b634e487b7160e01b835260418452602483fd5b81513d89823e3d90fd5b634e487b7160e01b885260118552602488fd5b8580fd5b8480fd5b8380fd5b60405162461bcd60e51b815260206004820152600b60248201526a726576657274206865726560a81b6044820152606490fdfea2646970667358221220b32282c4091e7b1e0ef38cfff23aebf1e60aad8d2696f353a69484cad09862a964736f6c63430008140033", - "deployedBytecode": "0x6080604081815260048036101561001557600080fd5b600092833560e01c9182635dab6f8c146100a7575050806361bc221a1461008b57637cf5b4fc1461004557600080fd5b34610087578160031936011261008757517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b5034610087578160031936011261008757602091549051908152f35b90928092506003193601126101b557803580151581036101b1576024359384151585036101ad578554600019949085811461019a576001018755867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156100875785848092630d0e30db60e41b825234905af1801561019057610162575b505061014a57835490811561014f575001825561014a5780f35b6101b9565b634e487b7160e01b855260119052602484fd5b67ffffffffffffffff829793971161017d5752933880610130565b634e487b7160e01b835260418452602483fd5b81513d89823e3d90fd5b634e487b7160e01b885260118552602488fd5b8580fd5b8480fd5b8380fd5b60405162461bcd60e51b815260206004820152600b60248201526a726576657274206865726560a81b6044820152606490fdfea2646970667358221220b32282c4091e7b1e0ef38cfff23aebf1e60aad8d2696f353a69484cad09862a964736f6c63430008140033", + "bytecode": "0x60a034606e57601f61029f38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b0381168103606e576080525f8055604051610218908161008782396080518181816054015260db0152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c9081635dab6f8c146100a35750806361bc221a1461008657637cf5b4fc1461003f575f80fd5b346100835780600319360112610083576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b503461008357806003193601126100835760209054604051908152f35b9050604036600319011261019757600435801515810361019757602435918215158303610197575f545f19811461019b576001015f557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561019757816004815f93630d0e30db60e41b825234905af1801561018c5761015b575b506101425781548015610147575f190182556101425780f35b6101af565b634e487b7160e01b83526011600452602483fd5b90925067ffffffffffffffff8111610178576040525f915f610129565b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b5f80fd5b634e487b7160e01b5f52601160045260245ffd5b60405162461bcd60e51b815260206004820152600b60248201526a726576657274206865726560a81b6044820152606490fdfea2646970667358221220b4c9df6cda0a02c2ef0f65ceb5f17b1c7f0721c4bd95669b8f68621c04793afc64736f6c634300081a0033", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f905f3560e01c9081635dab6f8c146100a35750806361bc221a1461008657637cf5b4fc1461003f575f80fd5b346100835780600319360112610083576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b503461008357806003193601126100835760209054604051908152f35b9050604036600319011261019757600435801515810361019757602435918215158303610197575f545f19811461019b576001015f557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561019757816004815f93630d0e30db60e41b825234905af1801561018c5761015b575b506101425781548015610147575f190182556101425780f35b6101af565b634e487b7160e01b83526011600452602483fd5b90925067ffffffffffffffff8111610178576040525f915f610129565b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b5f80fd5b634e487b7160e01b5f52601160045260245ffd5b60405162461bcd60e51b815260206004820152600b60248201526a726576657274206865726560a81b6044820152606490fdfea2646970667358221220b4c9df6cda0a02c2ef0f65ceb5f17b1c7f0721c4bd95669b8f68621c04793afc64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": { + "19688": [ + { + "length": 32, + "start": 84 + }, + { + "length": 32, + "start": 219 + } + ] + }, + "inputSourceName": "project/solidity/precompiles/werc20/testdata/WEVMOS9TestCaller.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/precompiles/werc20/tx.go b/precompiles/werc20/tx.go index a4c88504c..6c4ae2a83 100644 --- a/precompiles/werc20/tx.go +++ b/precompiles/werc20/tx.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" + cmn "github.com/cosmos/evm/precompiles/common" evmtypes "github.com/cosmos/evm/x/vm/types" "cosmossdk.io/math" @@ -45,11 +46,11 @@ func (p Precompile) Deposit( Amount: math.NewIntFromBigInt(depositedAmount.ToBig()), }), ); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, DepositMethod, err.Error()) } if err := p.EmitDepositEvent(ctx, stateDB, caller, depositedAmount.ToBig()); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, DepositMethod, err.Error()) } return nil, nil @@ -59,9 +60,13 @@ func (p Precompile) Deposit( // WETH contract to support equality between the native coin and its wrapped // ERC-20 (e.g. ATOM and WEVMOS). func (p Precompile) Withdraw(ctx sdk.Context, contract *vm.Contract, stateDB vm.StateDB, args []interface{}) ([]byte, error) { + if len(args) != 1 { + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(int64(len(args)))) + } + amount, ok := args[0].(*big.Int) if !ok { - return nil, fmt.Errorf("invalid argument type: %T", args[0]) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", args[0])) } amountInt := math.NewIntFromBigInt(amount) @@ -69,11 +74,11 @@ func (p Precompile) Withdraw(ctx sdk.Context, contract *vm.Contract, stateDB vm. callerAccAddress := sdk.AccAddress(caller.Bytes()) nativeBalance := p.BankKeeper.SpendableCoin(ctx, callerAccAddress, evmtypes.GetEVMCoinDenom()) if nativeBalance.Amount.LT(amountInt) { - return nil, fmt.Errorf("account balance %v is lower than withdraw balance %v", nativeBalance.Amount, amountInt) + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrMsgServerFailed, WithdrawMethod, fmt.Sprintf("account balance %v is lower than withdraw balance %v", nativeBalance.Amount, amountInt)) } if err := p.EmitWithdrawalEvent(ctx, stateDB, caller, amount); err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(p.ABI, cmn.SolidityErrEventEmitFailed, WithdrawMethod, err.Error()) } return nil, nil } diff --git a/precompiles/werc20/werc20.go b/precompiles/werc20/werc20.go index f7c476f1b..8b68386fd 100644 --- a/precompiles/werc20/werc20.go +++ b/precompiles/werc20/werc20.go @@ -102,7 +102,7 @@ func (p Precompile) Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]by func (p Precompile) Execute(ctx sdk.Context, stateDB vm.StateDB, contract *vm.Contract, readOnly bool) ([]byte, error) { method, args, err := cmn.SetupABI(p.ABI, contract, readOnly, p.IsTransaction) if err != nil { - return nil, err + return nil, cmn.NewRevertWithSolidityError(ABI, cmn.SolidityErrABISetupFailed, err.Error()) } var bz []byte diff --git a/scripts/compile_smart_contracts/compile_smart_contracts.py b/scripts/compile_smart_contracts/compile_smart_contracts.py index eacc1d374..4073ffe95 100644 --- a/scripts/compile_smart_contracts/compile_smart_contracts.py +++ b/scripts/compile_smart_contracts/compile_smart_contracts.py @@ -14,6 +14,7 @@ import os import re import sys +import json from dataclasses import dataclass from pathlib import Path from shutil import copy, rmtree @@ -269,6 +270,21 @@ def copy_compiled_contracts_back_to_source( print(f"-> did not find compiled JSON file for {contract.filename}") continue + # For precompile abi.json targets, keep only the ABI array. + # Hardhat v3 artifacts wrap ABI under an object with metadata fields. + if contract.compiled_json_path.name == "abi.json": + with open(compiled_path, "r", encoding="utf-8") as source_file: + artifact = json.load(source_file) + + abi_payload = artifact + if isinstance(artifact, dict) and "abi" in artifact: + abi_payload = artifact["abi"] + + with open(contract.compiled_json_path, "w", encoding="utf-8") as target_file: + json.dump(abi_payload, target_file, indent=2) + target_file.write("\n") + continue + copy(compiled_path, contract.compiled_json_path) @@ -320,9 +336,8 @@ def compile_files(repo_path: Path, added_contract: Union[str, None] = None): raise ValueError("Failed to copy contracts to target directory.") compile_contracts_in_dir(CONTRACTS_TARGET) - copy_compiled_contracts_back_to_source( - found_contracts, CONTRACTS_TARGET.parent / "artifacts" / SOLIDITY_SOURCE - ) + compiled_dir = CONTRACTS_TARGET.parent / "artifacts" / SOLIDITY_SOURCE + copy_compiled_contracts_back_to_source(found_contracts, compiled_dir) if __name__ == "__main__": diff --git a/tests/contracts/account_abstraction/entrypoint/SimpleEntryPoint.json b/tests/contracts/account_abstraction/entrypoint/SimpleEntryPoint.json index d2964948a..e8a615690 100644 --- a/tests/contracts/account_abstraction/entrypoint/SimpleEntryPoint.json +++ b/tests/contracts/account_abstraction/entrypoint/SimpleEntryPoint.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "SimpleEntryPoint", "sourceName": "solidity/tests/contracts/account_abstraction/entrypoint/SimpleEntryPoint.sol", "abi": [ @@ -99,8 +99,11 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610db1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063532d3ac914610030575b600080fd5b61004a600480360381019061004591906103bd565b61004c565b005b60005b8282905081101561028e573683838381811061006e5761006d61040a565b5b90506020028101906100809190610448565b9050600061008d82610293565b90508160000160208101906100a291906104cf565b73ffffffffffffffffffffffffffffffffffffffff16633a871cdd838360006040518463ffffffff1660e01b81526004016100df93929190610810565b6020604051808303816000875af192505050801561011b57506040513d601f19601f820116820180604052508101906101189190610863565b60015b6101865781600001602081019061013291906104cf565b73ffffffffffffffffffffffffffffffffffffffff16817f980a558f47f59a27189b156378a6cc54c9db5693b11ac559c5fa9fb29eb78719600060405161017991906108ab565b60405180910390a3610279565b50600082600001602081019061019c91906104cf565b73ffffffffffffffffffffffffffffffffffffffff168380606001906101c291906108c6565b6040516101d0929190610959565b6000604051808303816000865af19150503d806000811461020d576040519150601f19603f3d011682016040523d82523d6000602084013e610212565b606091505b5050905082600001602081019061022991906104cf565b73ffffffffffffffffffffffffffffffffffffffff16827f980a558f47f59a27189b156378a6cc54c9db5693b11ac559c5fa9fb29eb787198360405161026f91906108ab565b60405180910390a3505b50508080610286906109a1565b91505061004f565b505050565b600080826102a090610c90565b9050600081604001518051906020012090506000826060015180519060200120905060008361012001518051906020012090506000309050600046905085600001518660200151868689608001518a60a001518b60c001518c60e001518d61010001518b8b8b6040516020016103219c9b9a99989796959493929190610cc1565b604051602081830303815290604052805190602001209650505050505050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261037d5761037c610358565b5b8235905067ffffffffffffffff81111561039a5761039961035d565b5b6020830191508360208202830111156103b6576103b5610362565b5b9250929050565b600080602083850312156103d4576103d361034e565b5b600083013567ffffffffffffffff8111156103f2576103f1610353565b5b6103fe85828601610367565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b6000823560016101600383360303811261046557610464610439565b5b80830191505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061049c82610471565b9050919050565b6104ac81610491565b81146104b757600080fd5b50565b6000813590506104c9816104a3565b92915050565b6000602082840312156104e5576104e461034e565b5b60006104f3848285016104ba565b91505092915050565b600061050b60208401846104ba565b905092915050565b61051c81610491565b82525050565b6000819050919050565b61053581610522565b811461054057600080fd5b50565b6000813590506105528161052c565b92915050565b60006105676020840184610543565b905092915050565b61057881610522565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126105aa576105a9610588565b5b83810192508235915060208301925067ffffffffffffffff8211156105d2576105d161057e565b5b6001820236038313156105e8576105e7610583565b5b509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b600061062d83856105f0565b935061063a838584610601565b61064383610610565b840190509392505050565b6000610160830161066260008401846104fc565b61066f6000860182610513565b5061067d6020840184610558565b61068a602086018261056f565b50610698604084018461058d565b85830360408701526106ab838284610621565b925050506106bc606084018461058d565b85830360608701526106cf838284610621565b925050506106e06080840184610558565b6106ed608086018261056f565b506106fb60a0840184610558565b61070860a086018261056f565b5061071660c0840184610558565b61072360c086018261056f565b5061073160e0840184610558565b61073e60e086018261056f565b5061074d610100840184610558565b61075b61010086018261056f565b5061076a61012084018461058d565b85830361012087015261077e838284610621565b9250505061079061014084018461058d565b8583036101408701526107a4838284610621565b925050508091505092915050565b6000819050919050565b6107c5816107b2565b82525050565b6000819050919050565b6000819050919050565b60006107fa6107f56107f0846107cb565b6107d5565b610522565b9050919050565b61080a816107df565b82525050565b6000606082019050818103600083015261082a818661064e565b905061083960208301856107bc565b6108466040830184610801565b949350505050565b60008151905061085d8161052c565b92915050565b6000602082840312156108795761087861034e565b5b60006108878482850161084e565b91505092915050565b60008115159050919050565b6108a581610890565b82525050565b60006020820190506108c0600083018461089c565b92915050565b600080833560016020038436030381126108e3576108e2610439565b5b80840192508235915067ffffffffffffffff8211156109055761090461043e565b5b60208301925060018202360383131561092157610920610443565b5b509250929050565b600081905092915050565b60006109408385610929565b935061094d838584610601565b82840190509392505050565b6000610966828486610934565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006109ac82610522565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036109de576109dd610972565b5b600182019050919050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610a2682610610565b810181811067ffffffffffffffff82111715610a4557610a446109ee565b5b80604052505050565b6000610a58610344565b9050610a648282610a1d565b919050565b600080fd5b600080fd5b600067ffffffffffffffff821115610a8e57610a8d6109ee565b5b610a9782610610565b9050602081019050919050565b6000610ab7610ab284610a73565b610a4e565b905082815260208101848484011115610ad357610ad2610a6e565b5b610ade848285610601565b509392505050565b600082601f830112610afb57610afa610358565b5b8135610b0b848260208601610aa4565b91505092915050565b60006101608284031215610b2b57610b2a6109e9565b5b610b36610160610a4e565b90506000610b46848285016104ba565b6000830152506020610b5a84828501610543565b602083015250604082013567ffffffffffffffff811115610b7e57610b7d610a69565b5b610b8a84828501610ae6565b604083015250606082013567ffffffffffffffff811115610bae57610bad610a69565b5b610bba84828501610ae6565b6060830152506080610bce84828501610543565b60808301525060a0610be284828501610543565b60a08301525060c0610bf684828501610543565b60c08301525060e0610c0a84828501610543565b60e083015250610100610c1f84828501610543565b6101008301525061012082013567ffffffffffffffff811115610c4557610c44610a69565b5b610c5184828501610ae6565b6101208301525061014082013567ffffffffffffffff811115610c7757610c76610a69565b5b610c8384828501610ae6565b6101408301525092915050565b6000610c9c3683610b14565b9050919050565b610cac81610491565b82525050565b610cbb81610522565b82525050565b600061018082019050610cd7600083018f610ca3565b610ce4602083018e610cb2565b610cf1604083018d6107bc565b610cfe606083018c6107bc565b610d0b608083018b610cb2565b610d1860a083018a610cb2565b610d2560c0830189610cb2565b610d3260e0830188610cb2565b610d40610100830187610cb2565b610d4e6101208301866107bc565b610d5c610140830185610ca3565b610d6a610160830184610cb2565b9d9c5050505050505050505050505056fea26469706673582212208c7d78c56fc85f3203e4c9a3ac969f7f6b4283b7772b432a017fecf89e8e4a5264736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063532d3ac914610030575b600080fd5b61004a600480360381019061004591906103bd565b61004c565b005b60005b8282905081101561028e573683838381811061006e5761006d61040a565b5b90506020028101906100809190610448565b9050600061008d82610293565b90508160000160208101906100a291906104cf565b73ffffffffffffffffffffffffffffffffffffffff16633a871cdd838360006040518463ffffffff1660e01b81526004016100df93929190610810565b6020604051808303816000875af192505050801561011b57506040513d601f19601f820116820180604052508101906101189190610863565b60015b6101865781600001602081019061013291906104cf565b73ffffffffffffffffffffffffffffffffffffffff16817f980a558f47f59a27189b156378a6cc54c9db5693b11ac559c5fa9fb29eb78719600060405161017991906108ab565b60405180910390a3610279565b50600082600001602081019061019c91906104cf565b73ffffffffffffffffffffffffffffffffffffffff168380606001906101c291906108c6565b6040516101d0929190610959565b6000604051808303816000865af19150503d806000811461020d576040519150601f19603f3d011682016040523d82523d6000602084013e610212565b606091505b5050905082600001602081019061022991906104cf565b73ffffffffffffffffffffffffffffffffffffffff16827f980a558f47f59a27189b156378a6cc54c9db5693b11ac559c5fa9fb29eb787198360405161026f91906108ab565b60405180910390a3505b50508080610286906109a1565b91505061004f565b505050565b600080826102a090610c90565b9050600081604001518051906020012090506000826060015180519060200120905060008361012001518051906020012090506000309050600046905085600001518660200151868689608001518a60a001518b60c001518c60e001518d61010001518b8b8b6040516020016103219c9b9a99989796959493929190610cc1565b604051602081830303815290604052805190602001209650505050505050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261037d5761037c610358565b5b8235905067ffffffffffffffff81111561039a5761039961035d565b5b6020830191508360208202830111156103b6576103b5610362565b5b9250929050565b600080602083850312156103d4576103d361034e565b5b600083013567ffffffffffffffff8111156103f2576103f1610353565b5b6103fe85828601610367565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b6000823560016101600383360303811261046557610464610439565b5b80830191505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061049c82610471565b9050919050565b6104ac81610491565b81146104b757600080fd5b50565b6000813590506104c9816104a3565b92915050565b6000602082840312156104e5576104e461034e565b5b60006104f3848285016104ba565b91505092915050565b600061050b60208401846104ba565b905092915050565b61051c81610491565b82525050565b6000819050919050565b61053581610522565b811461054057600080fd5b50565b6000813590506105528161052c565b92915050565b60006105676020840184610543565b905092915050565b61057881610522565b82525050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126105aa576105a9610588565b5b83810192508235915060208301925067ffffffffffffffff8211156105d2576105d161057e565b5b6001820236038313156105e8576105e7610583565b5b509250929050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b600061062d83856105f0565b935061063a838584610601565b61064383610610565b840190509392505050565b6000610160830161066260008401846104fc565b61066f6000860182610513565b5061067d6020840184610558565b61068a602086018261056f565b50610698604084018461058d565b85830360408701526106ab838284610621565b925050506106bc606084018461058d565b85830360608701526106cf838284610621565b925050506106e06080840184610558565b6106ed608086018261056f565b506106fb60a0840184610558565b61070860a086018261056f565b5061071660c0840184610558565b61072360c086018261056f565b5061073160e0840184610558565b61073e60e086018261056f565b5061074d610100840184610558565b61075b61010086018261056f565b5061076a61012084018461058d565b85830361012087015261077e838284610621565b9250505061079061014084018461058d565b8583036101408701526107a4838284610621565b925050508091505092915050565b6000819050919050565b6107c5816107b2565b82525050565b6000819050919050565b6000819050919050565b60006107fa6107f56107f0846107cb565b6107d5565b610522565b9050919050565b61080a816107df565b82525050565b6000606082019050818103600083015261082a818661064e565b905061083960208301856107bc565b6108466040830184610801565b949350505050565b60008151905061085d8161052c565b92915050565b6000602082840312156108795761087861034e565b5b60006108878482850161084e565b91505092915050565b60008115159050919050565b6108a581610890565b82525050565b60006020820190506108c0600083018461089c565b92915050565b600080833560016020038436030381126108e3576108e2610439565b5b80840192508235915067ffffffffffffffff8211156109055761090461043e565b5b60208301925060018202360383131561092157610920610443565b5b509250929050565b600081905092915050565b60006109408385610929565b935061094d838584610601565b82840190509392505050565b6000610966828486610934565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006109ac82610522565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036109de576109dd610972565b5b600182019050919050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610a2682610610565b810181811067ffffffffffffffff82111715610a4557610a446109ee565b5b80604052505050565b6000610a58610344565b9050610a648282610a1d565b919050565b600080fd5b600080fd5b600067ffffffffffffffff821115610a8e57610a8d6109ee565b5b610a9782610610565b9050602081019050919050565b6000610ab7610ab284610a73565b610a4e565b905082815260208101848484011115610ad357610ad2610a6e565b5b610ade848285610601565b509392505050565b600082601f830112610afb57610afa610358565b5b8135610b0b848260208601610aa4565b91505092915050565b60006101608284031215610b2b57610b2a6109e9565b5b610b36610160610a4e565b90506000610b46848285016104ba565b6000830152506020610b5a84828501610543565b602083015250604082013567ffffffffffffffff811115610b7e57610b7d610a69565b5b610b8a84828501610ae6565b604083015250606082013567ffffffffffffffff811115610bae57610bad610a69565b5b610bba84828501610ae6565b6060830152506080610bce84828501610543565b60808301525060a0610be284828501610543565b60a08301525060c0610bf684828501610543565b60c08301525060e0610c0a84828501610543565b60e083015250610100610c1f84828501610543565b6101008301525061012082013567ffffffffffffffff811115610c4557610c44610a69565b5b610c5184828501610ae6565b6101208301525061014082013567ffffffffffffffff811115610c7757610c76610a69565b5b610c8384828501610ae6565b6101408301525092915050565b6000610c9c3683610b14565b9050919050565b610cac81610491565b82525050565b610cbb81610522565b82525050565b600061018082019050610cd7600083018f610ca3565b610ce4602083018e610cb2565b610cf1604083018d6107bc565b610cfe606083018c6107bc565b610d0b608083018b610cb2565b610d1860a083018a610cb2565b610d2560c0830189610cb2565b610d3260e0830188610cb2565b610d40610100830187610cb2565b610d4e6101208301866107bc565b610d5c610140830185610ca3565b610d6a610160830184610cb2565b9d9c5050505050505050505050505056fea26469706673582212208c7d78c56fc85f3203e4c9a3ac969f7f6b4283b7772b432a017fecf89e8e4a5264736f6c63430008140033", + "bytecode": "0x6080806040523460155761067b908161001a8239f35b5f80fdfe60a06040526004361015610011575f80fd5b5f3560e01c63532d3ac914610024575f80fd5b34610502576020366003190112610502576004356001600160401b03811161050257366023820112156105025780600401356001600160401b038111610502573660248260051b84010111610502573682900361018219015f5b828110156105485760248160051b850101356080528160805112156105025760805184016024810191903603602319016101608112610502576040519261016084018481106001600160401b03821117610534576040526100de8161057f565b845260446080518801013591826020860152606460805189010180356001600160401b0381116105025761011c90602436916080518d0101016105ff565b956040810196875260846080518b0101908135926001600160401b038411610502576024848d60805101010198610153368b6105ff565b606084019081528d608085019160a460805183010135835260c4608051830101359560a081019287845260c082019560e460805183010135875260e083019161010460805182010135835261012460805182010135610100850152610144608051820101356001600160401b038111610502576101da9060243691608051850101016105ff565b610120850152610164608051820101356001600160401b03811161050257369160805101016024019061020c916105ff565b6101408401525180519060200120925180519060200120956101208301518051906020012094600160a01b600190038451169760208501519751915192519351946101000151956040519860208a019a8b5260408a01526060890152608088015260a087015260c086015260e0850152610100840152610120830152610140820152306101608201524661018082015261018081526102ad6101a08261055e565b519020968c6001600160a01b036102c38961054a565b604051633a871cdd60e01b81526060600482015296911694869485949192916001600160a01b036102f38d61057f565b1660648701526084860152610308908b610593565b60a4860161016090526101c4860190610320926105c4565b9061032b908b610593565b8583036063190160c487015261034192916105c4565b916080510160a4013560e48401526101048301528d6080510160e401356101248301528d6080510161010401356101448301528d6080510161012401356101648301528d60805101610144016103979089610593565b838303606319016101848501526103ae92916105c4565b8d60805101610164016103c19089610593565b838303606319016101a48501526103d892916105c4565b886024830152604482015f905203815a6020945f91f19081610506575b506104455750600194506001600160a01b0391610412915061054a565b16907f980a558f47f59a27189b156378a6cc54c9db5693b11ac559c5fa9fb29eb7871960206040515f8152a35b0161007e565b61045083949361054a565b91601e19011315610502578435946001600160401b03861161050257602001908536038213610502575f8060209288827f980a558f47f59a27189b156378a6cc54c9db5693b11ac559c5fa9fb29eb787199660019b6040519384928337810182815203925af1933d156104fd573d6104c7816105e4565b906104d5604051928361055e565b81525f833d92013e5b6104ed878060a01b039161054a565b16936040519015158152a361043f565b6104de565b5f80fd5b6020813d821161052c575b8161051e6020938361055e565b8101031261050257516103f5565b3d9150610511565b634e487b7160e01b5f52604160045260245ffd5b005b356001600160a01b03811681036105025790565b90601f801991011681019081106001600160401b0382111761053457604052565b35906001600160a01b038216820361050257565b9035601e19823603018112156105025701602081359101916001600160401b03821161050257813603831361050257565b908060209392818452848401375f828201840152601f01601f1916010190565b6001600160401b03811161053457601f01601f191660200190565b81601f8201121561050257803590610616826105e4565b92610624604051948561055e565b8284526020838301011161050257815f92602080930183860137830101529056fea264697066735822122041bd0cbb6d939b792c50624a576cfef7babc90729d8d67cd4e2e62b13c3c354564736f6c634300081a0033", + "deployedBytecode": "0x60a06040526004361015610011575f80fd5b5f3560e01c63532d3ac914610024575f80fd5b34610502576020366003190112610502576004356001600160401b03811161050257366023820112156105025780600401356001600160401b038111610502573660248260051b84010111610502573682900361018219015f5b828110156105485760248160051b850101356080528160805112156105025760805184016024810191903603602319016101608112610502576040519261016084018481106001600160401b03821117610534576040526100de8161057f565b845260446080518801013591826020860152606460805189010180356001600160401b0381116105025761011c90602436916080518d0101016105ff565b956040810196875260846080518b0101908135926001600160401b038411610502576024848d60805101010198610153368b6105ff565b606084019081528d608085019160a460805183010135835260c4608051830101359560a081019287845260c082019560e460805183010135875260e083019161010460805182010135835261012460805182010135610100850152610144608051820101356001600160401b038111610502576101da9060243691608051850101016105ff565b610120850152610164608051820101356001600160401b03811161050257369160805101016024019061020c916105ff565b6101408401525180519060200120925180519060200120956101208301518051906020012094600160a01b600190038451169760208501519751915192519351946101000151956040519860208a019a8b5260408a01526060890152608088015260a087015260c086015260e0850152610100840152610120830152610140820152306101608201524661018082015261018081526102ad6101a08261055e565b519020968c6001600160a01b036102c38961054a565b604051633a871cdd60e01b81526060600482015296911694869485949192916001600160a01b036102f38d61057f565b1660648701526084860152610308908b610593565b60a4860161016090526101c4860190610320926105c4565b9061032b908b610593565b8583036063190160c487015261034192916105c4565b916080510160a4013560e48401526101048301528d6080510160e401356101248301528d6080510161010401356101448301528d6080510161012401356101648301528d60805101610144016103979089610593565b838303606319016101848501526103ae92916105c4565b8d60805101610164016103c19089610593565b838303606319016101a48501526103d892916105c4565b886024830152604482015f905203815a6020945f91f19081610506575b506104455750600194506001600160a01b0391610412915061054a565b16907f980a558f47f59a27189b156378a6cc54c9db5693b11ac559c5fa9fb29eb7871960206040515f8152a35b0161007e565b61045083949361054a565b91601e19011315610502578435946001600160401b03861161050257602001908536038213610502575f8060209288827f980a558f47f59a27189b156378a6cc54c9db5693b11ac559c5fa9fb29eb787199660019b6040519384928337810182815203925af1933d156104fd573d6104c7816105e4565b906104d5604051928361055e565b81525f833d92013e5b6104ed878060a01b039161054a565b16936040519015158152a361043f565b6104de565b5f80fd5b6020813d821161052c575b8161051e6020938361055e565b8101031261050257516103f5565b3d9150610511565b634e487b7160e01b5f52604160045260245ffd5b005b356001600160a01b03811681036105025790565b90601f801991011681019081106001600160401b0382111761053457604052565b35906001600160a01b038216820361050257565b9035601e19823603018112156105025701602081359101916001600160401b03821161050257813603831361050257565b908060209392818452848401375f828201840152601f01601f1916010190565b6001600160401b03811161053457601f01601f191660200190565b81601f8201121561050257803590610616826105e4565b92610624604051948561055e565b8284526020838301011161050257815f92602080930183860137830101529056fea264697066735822122041bd0cbb6d939b792c50624a576cfef7babc90729d8d67cd4e2e62b13c3c354564736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/tests/contracts/account_abstraction/entrypoint/SimpleEntryPoint.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.json b/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.json index be3118596..c1b26bfab 100644 --- a/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.json +++ b/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "SimpleSmartWallet", "sourceName": "solidity/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.sol", "abi": [ @@ -8,7 +8,7 @@ "name": "entryPoint", "outputs": [ { - "internalType": "contract EntryPoint", + "internalType": "address", "name": "", "type": "address" } @@ -47,7 +47,7 @@ "type": "address" }, { - "internalType": "contract EntryPoint", + "internalType": "address", "name": "_entryPoint", "type": "address" } @@ -161,8 +161,11 @@ "type": "receive" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610d71806100206000396000f3fe60806040526004361061004e5760003560e01c80633a871cdd1461005a578063485cc955146100975780638da5cb5b146100c0578063b0d691fe146100eb578063b61d27f61461011657610055565b3661005557005b600080fd5b34801561006657600080fd5b50610081600480360381019061007c91906106d0565b61013f565b60405161008e919061074e565b60405180910390f35b3480156100a357600080fd5b506100be60048036038101906100b99190610817565b610328565b005b3480156100cc57600080fd5b506100d561043c565b6040516100e29190610866565b60405180910390f35b3480156100f757600080fd5b50610100610460565b60405161010d91906108e0565b60405180910390f35b34801561012257600080fd5b5061013d60048036038101906101389190610960565b610486565b005b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101c890610a31565b60405180910390fd5b6000806000610232878061014001906101ea9190610a60565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506105cd565b92509250925060006001878585856040516000815260200160405260405161025d9493929190610aee565b6020604051602081039080840390855afa15801561027f573d6000803e3d6000fd5b50505060206040510351905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031090610b7f565b60405180910390fd5b60009450505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146103b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ae90610beb565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050d90610a31565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16848484604051610540929190610c4a565b60006040518083038185875af1925050503d806000811461057d576040519150601f19603f3d011682016040523d82523d6000602084013e610582565b606091505b50509050806105c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bd90610caf565b60405180910390fd5b5050505050565b60008060006041845114610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610d1b565b60405180910390fd5b6020840151915060408401519050606084015160001a92509193909250565b600080fd5b600080fd5b600080fd5b6000610160828403121561065b5761065a61063f565b5b81905092915050565b6000819050919050565b61067781610664565b811461068257600080fd5b50565b6000813590506106948161066e565b92915050565b6000819050919050565b6106ad8161069a565b81146106b857600080fd5b50565b6000813590506106ca816106a4565b92915050565b6000806000606084860312156106e9576106e8610635565b5b600084013567ffffffffffffffff8111156107075761070661063a565b5b61071386828701610644565b935050602061072486828701610685565b9250506040610735868287016106bb565b9150509250925092565b6107488161069a565b82525050565b6000602082019050610763600083018461073f565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061079482610769565b9050919050565b6107a481610789565b81146107af57600080fd5b50565b6000813590506107c18161079b565b92915050565b60006107d282610769565b9050919050565b60006107e4826107c7565b9050919050565b6107f4816107d9565b81146107ff57600080fd5b50565b600081359050610811816107eb565b92915050565b6000806040838503121561082e5761082d610635565b5b600061083c858286016107b2565b925050602061084d85828601610802565b9150509250929050565b61086081610789565b82525050565b600060208201905061087b6000830184610857565b92915050565b6000819050919050565b60006108a66108a161089c84610769565b610881565b610769565b9050919050565b60006108b88261088b565b9050919050565b60006108ca826108ad565b9050919050565b6108da816108bf565b82525050565b60006020820190506108f560008301846108d1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126109205761091f6108fb565b5b8235905067ffffffffffffffff81111561093d5761093c610900565b5b60208301915083600182028301111561095957610958610905565b5b9250929050565b6000806000806060858703121561097a57610979610635565b5b6000610988878288016107b2565b9450506020610999878288016106bb565b935050604085013567ffffffffffffffff8111156109ba576109b961063a565b5b6109c68782880161090a565b925092505092959194509250565b600082825260208201905092915050565b7f6f6e6c7920456e747279506f696e740000000000000000000000000000000000600082015250565b6000610a1b600f836109d4565b9150610a26826109e5565b602082019050919050565b60006020820190508181036000830152610a4a81610a0e565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610a7d57610a7c610a51565b5b80840192508235915067ffffffffffffffff821115610a9f57610a9e610a56565b5b602083019250600182023603831315610abb57610aba610a5b565b5b509250929050565b610acc81610664565b82525050565b600060ff82169050919050565b610ae881610ad2565b82525050565b6000608082019050610b036000830187610ac3565b610b106020830186610adf565b610b1d6040830185610ac3565b610b2a6060830184610ac3565b95945050505050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b6000610b696011836109d4565b9150610b7482610b33565b602082019050919050565b60006020820190508181036000830152610b9881610b5c565b9050919050565b7f616c726561647920696e697469616c697a656400000000000000000000000000600082015250565b6000610bd56013836109d4565b9150610be082610b9f565b602082019050919050565b60006020820190508181036000830152610c0481610bc8565b9050919050565b600081905092915050565b82818337600083830152505050565b6000610c318385610c0b565b9350610c3e838584610c16565b82840190509392505050565b6000610c57828486610c25565b91508190509392505050565b7f457865637574696f6e206661696c656400000000000000000000000000000000600082015250565b6000610c996010836109d4565b9150610ca482610c63565b602082019050919050565b60006020820190508181036000830152610cc881610c8c565b9050919050565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b6000610d056018836109d4565b9150610d1082610ccf565b602082019050919050565b60006020820190508181036000830152610d3481610cf8565b905091905056fea26469706673582212202c2c5b43eeb782fbe350b110535f44d858d4290cec37b9b86124fe5886827a0364736f6c63430008140033", - "deployedBytecode": "0x60806040526004361061004e5760003560e01c80633a871cdd1461005a578063485cc955146100975780638da5cb5b146100c0578063b0d691fe146100eb578063b61d27f61461011657610055565b3661005557005b600080fd5b34801561006657600080fd5b50610081600480360381019061007c91906106d0565b61013f565b60405161008e919061074e565b60405180910390f35b3480156100a357600080fd5b506100be60048036038101906100b99190610817565b610328565b005b3480156100cc57600080fd5b506100d561043c565b6040516100e29190610866565b60405180910390f35b3480156100f757600080fd5b50610100610460565b60405161010d91906108e0565b60405180910390f35b34801561012257600080fd5b5061013d60048036038101906101389190610960565b610486565b005b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101c890610a31565b60405180910390fd5b6000806000610232878061014001906101ea9190610a60565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506105cd565b92509250925060006001878585856040516000815260200160405260405161025d9493929190610aee565b6020604051602081039080840390855afa15801561027f573d6000803e3d6000fd5b50505060206040510351905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031090610b7f565b60405180910390fd5b60009450505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146103b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ae90610beb565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050d90610a31565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16848484604051610540929190610c4a565b60006040518083038185875af1925050503d806000811461057d576040519150601f19603f3d011682016040523d82523d6000602084013e610582565b606091505b50509050806105c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bd90610caf565b60405180910390fd5b5050505050565b60008060006041845114610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610d1b565b60405180910390fd5b6020840151915060408401519050606084015160001a92509193909250565b600080fd5b600080fd5b600080fd5b6000610160828403121561065b5761065a61063f565b5b81905092915050565b6000819050919050565b61067781610664565b811461068257600080fd5b50565b6000813590506106948161066e565b92915050565b6000819050919050565b6106ad8161069a565b81146106b857600080fd5b50565b6000813590506106ca816106a4565b92915050565b6000806000606084860312156106e9576106e8610635565b5b600084013567ffffffffffffffff8111156107075761070661063a565b5b61071386828701610644565b935050602061072486828701610685565b9250506040610735868287016106bb565b9150509250925092565b6107488161069a565b82525050565b6000602082019050610763600083018461073f565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061079482610769565b9050919050565b6107a481610789565b81146107af57600080fd5b50565b6000813590506107c18161079b565b92915050565b60006107d282610769565b9050919050565b60006107e4826107c7565b9050919050565b6107f4816107d9565b81146107ff57600080fd5b50565b600081359050610811816107eb565b92915050565b6000806040838503121561082e5761082d610635565b5b600061083c858286016107b2565b925050602061084d85828601610802565b9150509250929050565b61086081610789565b82525050565b600060208201905061087b6000830184610857565b92915050565b6000819050919050565b60006108a66108a161089c84610769565b610881565b610769565b9050919050565b60006108b88261088b565b9050919050565b60006108ca826108ad565b9050919050565b6108da816108bf565b82525050565b60006020820190506108f560008301846108d1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126109205761091f6108fb565b5b8235905067ffffffffffffffff81111561093d5761093c610900565b5b60208301915083600182028301111561095957610958610905565b5b9250929050565b6000806000806060858703121561097a57610979610635565b5b6000610988878288016107b2565b9450506020610999878288016106bb565b935050604085013567ffffffffffffffff8111156109ba576109b961063a565b5b6109c68782880161090a565b925092505092959194509250565b600082825260208201905092915050565b7f6f6e6c7920456e747279506f696e740000000000000000000000000000000000600082015250565b6000610a1b600f836109d4565b9150610a26826109e5565b602082019050919050565b60006020820190508181036000830152610a4a81610a0e565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610a7d57610a7c610a51565b5b80840192508235915067ffffffffffffffff821115610a9f57610a9e610a56565b5b602083019250600182023603831315610abb57610aba610a5b565b5b509250929050565b610acc81610664565b82525050565b600060ff82169050919050565b610ae881610ad2565b82525050565b6000608082019050610b036000830187610ac3565b610b106020830186610adf565b610b1d6040830185610ac3565b610b2a6060830184610ac3565b95945050505050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b6000610b696011836109d4565b9150610b7482610b33565b602082019050919050565b60006020820190508181036000830152610b9881610b5c565b9050919050565b7f616c726561647920696e697469616c697a656400000000000000000000000000600082015250565b6000610bd56013836109d4565b9150610be082610b9f565b602082019050919050565b60006020820190508181036000830152610c0481610bc8565b9050919050565b600081905092915050565b82818337600083830152505050565b6000610c318385610c0b565b9350610c3e838584610c16565b82840190509392505050565b6000610c57828486610c25565b91508190509392505050565b7f457865637574696f6e206661696c656400000000000000000000000000000000600082015250565b6000610c996010836109d4565b9150610ca482610c63565b602082019050919050565b60006020820190508181036000830152610cc881610c8c565b9050919050565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b6000610d056018836109d4565b9150610d1082610ccf565b602082019050919050565b60006020820190508181036000830152610d3481610cf8565b905091905056fea26469706673582212202c2c5b43eeb782fbe350b110535f44d858d4290cec37b9b86124fe5886827a0364736f6c63430008140033", + "bytecode": "0x60808060405234601557610515908161001a8239f35b5f80fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80633a871cdd14610069578063485cc955146100645780638da5cb5b1461005f578063b0d691fe1461005a5763b61d27f60361000e57610276565b61024e565b610227565b610192565b346101625760603660031901126101625760043567ffffffffffffffff81116101625780360390610160600319830112610162576100b260018060a01b036001541633146102de565b6101448101359160221901821215610162570160048101359067ffffffffffffffff8211610162576024018136038113610162576101286101006100fb5f936020953691610377565b610481565b60408051602435815260ff909416602085015283019190915260608201529081906080820190565b838052039060015afa1561015d575f80519054610152916001600160a01b039081169116146103b2565b6040515f8152602090f35b6103a7565b5f80fd5b600435906001600160a01b038216820361016257565b602435906001600160a01b038216820361016257565b34610162576040366003190112610162576101ab610166565b6101b361017c565b5f546001600160a01b0381166101ec576001600160a01b039283166001600160a01b0319918216175f5560018054929093169116179055005b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b34610162575f366003190112610162575f546040516001600160a01b039091168152602090f35b34610162575f366003190112610162576001546040516001600160a01b039091168152602090f35b346101625760603660031901126101625761028f610166565b6024356044359167ffffffffffffffff831161016257366023840112156101625782600401359167ffffffffffffffff83116101625736602484860101116101625760246100189401916103f2565b156102e557565b60405162461bcd60e51b815260206004820152600f60248201526e1bdb9b1e48115b9d1c9e541bda5b9d608a1b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761035657604052565b61031c565b67ffffffffffffffff811161035657601f01601f191660200190565b92919261038b6103868361035b565b610330565b938285528282011161016257815f926020928387013784010152565b6040513d5f823e3d90fd5b156103b957565b60405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606490fd5b90925f93849361040d60018060a01b036001541633146102de565b826040519384928337810185815203925af13d1561047c573d6104326103868261035b565b9081525f60203d92013e5b1561044457565b60405162461bcd60e51b815260206004820152601060248201526f115e1958dd5d1a5bdb8819985a5b195960821b6044820152606490fd5b61043d565b604181510361049f57602081015190606060408201519101515f1a92565b60405162461bcd60e51b81526020600482015260186024820152770d2dcecc2d8d2c840e6d2cedcc2e8eae4ca40d8cadccee8d60431b6044820152606490fdfea26469706673582212208ed88bc6ac325b24a1faa109d082438af9861c54b2ae16cc569727e91e24503264736f6c634300081a0033", + "deployedBytecode": "0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80633a871cdd14610069578063485cc955146100645780638da5cb5b1461005f578063b0d691fe1461005a5763b61d27f60361000e57610276565b61024e565b610227565b610192565b346101625760603660031901126101625760043567ffffffffffffffff81116101625780360390610160600319830112610162576100b260018060a01b036001541633146102de565b6101448101359160221901821215610162570160048101359067ffffffffffffffff8211610162576024018136038113610162576101286101006100fb5f936020953691610377565b610481565b60408051602435815260ff909416602085015283019190915260608201529081906080820190565b838052039060015afa1561015d575f80519054610152916001600160a01b039081169116146103b2565b6040515f8152602090f35b6103a7565b5f80fd5b600435906001600160a01b038216820361016257565b602435906001600160a01b038216820361016257565b34610162576040366003190112610162576101ab610166565b6101b361017c565b5f546001600160a01b0381166101ec576001600160a01b039283166001600160a01b0319918216175f5560018054929093169116179055005b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b34610162575f366003190112610162575f546040516001600160a01b039091168152602090f35b34610162575f366003190112610162576001546040516001600160a01b039091168152602090f35b346101625760603660031901126101625761028f610166565b6024356044359167ffffffffffffffff831161016257366023840112156101625782600401359167ffffffffffffffff83116101625736602484860101116101625760246100189401916103f2565b156102e557565b60405162461bcd60e51b815260206004820152600f60248201526e1bdb9b1e48115b9d1c9e541bda5b9d608a1b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761035657604052565b61031c565b67ffffffffffffffff811161035657601f01601f191660200190565b92919261038b6103868361035b565b610330565b938285528282011161016257815f926020928387013784010152565b6040513d5f823e3d90fd5b156103b957565b60405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606490fd5b90925f93849361040d60018060a01b036001541633146102de565b826040519384928337810185815203925af13d1561047c573d6104326103868261035b565b9081525f60203d92013e5b1561044457565b60405162461bcd60e51b815260206004820152601060248201526f115e1958dd5d1a5bdb8819985a5b195960821b6044820152606490fd5b61043d565b604181510361049f57602081015190606060408201519101515f1a92565b60405162461bcd60e51b81526020600482015260186024820152770d2dcecc2d8d2c840e6d2cedcc2e8eae4ca40d8cadccee8d60431b6044820152606490fdfea26469706673582212208ed88bc6ac325b24a1faa109d082438af9861c54b2ae16cc569727e91e24503264736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.sol b/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.sol index 77053a1d0..72b562209 100644 --- a/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.sol +++ b/tests/contracts/account_abstraction/smartwallet/SimpleSmartWallet.sol @@ -3,13 +3,12 @@ pragma solidity ^0.8.0; import "@account-abstraction/contracts/interfaces/IAccount.sol"; -import "@account-abstraction/contracts/core/EntryPoint.sol"; contract SimpleSmartWallet is IAccount { address public owner; - EntryPoint public entryPoint; + address public entryPoint; - function initialize(address _owner, EntryPoint _entryPoint) external { + function initialize(address _owner, address _entryPoint) external { require(owner == address(0), "already initialized"); owner = _owner; entryPoint = _entryPoint; @@ -20,7 +19,7 @@ contract SimpleSmartWallet is IAccount { bytes32 userOpHash, uint256 /* missingAccountFunds */ ) external view override returns (uint256 validationData) { - require(msg.sender == address(entryPoint), "only EntryPoint"); + require(msg.sender == entryPoint, "only EntryPoint"); (uint8 v, bytes32 r, bytes32 s) = _split(userOp.signature); address recovered = ecrecover(userOpHash, v, r, s); @@ -30,7 +29,7 @@ contract SimpleSmartWallet is IAccount { } function execute(address target, uint256 value, bytes calldata data) external { - require(msg.sender == address(entryPoint), "only EntryPoint"); + require(msg.sender == entryPoint, "only EntryPoint"); (bool success, ) = target.call{value: value}(data); require(success, "Execution failed"); } diff --git a/tests/contracts/account_abstraction/tokens/SimpleERC20.json b/tests/contracts/account_abstraction/tokens/SimpleERC20.json index d98d81221..f5a9af6d0 100644 --- a/tests/contracts/account_abstraction/tokens/SimpleERC20.json +++ b/tests/contracts/account_abstraction/tokens/SimpleERC20.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "SimpleERC20", "sourceName": "solidity/tests/contracts/account_abstraction/tokens/SimpleERC20.sol", "abi": [ @@ -231,8 +231,11 @@ "type": "function" } ], - "bytecode": "0x60806040526040518060400160405280600881526020017f4d7920546f6b656e000000000000000000000000000000000000000000000000815250600090816200004a9190620003b6565b506040518060400160405280600381526020017f4d544b000000000000000000000000000000000000000000000000000000000081525060019081620000919190620003b6565b506012600260006101000a81548160ff021916908360ff160217905550600260009054906101000a900460ff1660ff16600a620000cf919062000620565b620f4240620000df919062000671565b600355348015620000ef57600080fd5b50600354600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620006bc565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001be57607f821691505b602082108103620001d457620001d362000176565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200023e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620001ff565b6200024a8683620001ff565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000297620002916200028b8462000262565b6200026c565b62000262565b9050919050565b6000819050919050565b620002b38362000276565b620002cb620002c2826200029e565b8484546200020c565b825550505050565b600090565b620002e2620002d3565b620002ef818484620002a8565b505050565b5b8181101562000317576200030b600082620002d8565b600181019050620002f5565b5050565b601f82111562000366576200033081620001da565b6200033b84620001ef565b810160208510156200034b578190505b620003636200035a85620001ef565b830182620002f4565b50505b505050565b600082821c905092915050565b60006200038b600019846008026200036b565b1980831691505092915050565b6000620003a6838362000378565b9150826002028217905092915050565b620003c1826200013c565b67ffffffffffffffff811115620003dd57620003dc62000147565b5b620003e98254620001a5565b620003f68282856200031b565b600060209050601f8311600181146200042e576000841562000419578287015190505b62000425858262000398565b86555062000495565b601f1984166200043e86620001da565b60005b82811015620004685784890151825560018201915060208501945060208101905062000441565b8683101562000488578489015162000484601f89168262000378565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200052b578086048111156200050357620005026200049d565b5b6001851615620005135780820291505b80810290506200052385620004cc565b9450620004e3565b94509492505050565b60008262000546576001905062000619565b8162000556576000905062000619565b81600181146200056f57600281146200057a57620005b0565b600191505062000619565b60ff8411156200058f576200058e6200049d565b5b8360020a915084821115620005a957620005a86200049d565b5b5062000619565b5060208310610133831016604e8410600b8410161715620005ea5782820a905083811115620005e457620005e36200049d565b5b62000619565b620005f98484846001620004d9565b925090508184048111156200061357620006126200049d565b5b81810290505b9392505050565b60006200062d8262000262565b91506200063a8362000262565b9250620006697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000534565b905092915050565b60006200067e8262000262565b91506200068b8362000262565b92508282026200069b8162000262565b91508282048414831517620006b557620006b46200049d565b5b5092915050565b610ddc80620006cc6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce5671461013457806370a082311461015257806395d89b4114610182578063a9059cbb146101a0578063dd62ed3e146101d057610093565b806306fdde0314610098578063095ea7b3146100b657806318160ddd146100e657806323b872dd14610104575b600080fd5b6100a0610200565b6040516100ad9190610985565b60405180910390f35b6100d060048036038101906100cb9190610a40565b61028e565b6040516100dd9190610a9b565b60405180910390f35b6100ee610380565b6040516100fb9190610ac5565b60405180910390f35b61011e60048036038101906101199190610ae0565b610386565b60405161012b9190610a9b565b60405180910390f35b61013c610678565b6040516101499190610b4f565b60405180910390f35b61016c60048036038101906101679190610b6a565b61068b565b6040516101799190610ac5565b60405180910390f35b61018a6106a3565b6040516101979190610985565b60405180910390f35b6101ba60048036038101906101b59190610a40565b610731565b6040516101c79190610a9b565b60405180910390f35b6101ea60048036038101906101e59190610b97565b6108d0565b6040516101f79190610ac5565b60405180910390f35b6000805461020d90610c06565b80601f016020809104026020016040519081016040528092919081815260200182805461023990610c06565b80156102865780601f1061025b57610100808354040283529160200191610286565b820191906000526020600020905b81548152906001019060200180831161026957829003601f168201915b505050505081565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161036e9190610ac5565b60405180910390a36001905092915050565b60035481565b600081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561040a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040190610c83565b60405180910390fd5b81600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156104c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c090610cef565b60405180910390fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546105189190610d3e565b9250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461056e9190610d72565b9250508190555081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106019190610d3e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516106659190610ac5565b60405180910390a3600190509392505050565b600260009054906101000a900460ff1681565b60046020528060005260406000206000915090505481565b600180546106b090610c06565b80601f01602080910402602001604051908101604052809291908181526020018280546106dc90610c06565b80156107295780601f106106fe57610100808354040283529160200191610729565b820191906000526020600020905b81548152906001019060200180831161070c57829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156107b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ac90610c83565b60405180910390fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108049190610d3e565b9250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461085a9190610d72565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108be9190610ac5565b60405180910390a36001905092915050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600081519050919050565b600082825260208201905092915050565b60005b8381101561092f578082015181840152602081019050610914565b60008484015250505050565b6000601f19601f8301169050919050565b6000610957826108f5565b6109618185610900565b9350610971818560208601610911565b61097a8161093b565b840191505092915050565b6000602082019050818103600083015261099f818461094c565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006109d7826109ac565b9050919050565b6109e7816109cc565b81146109f257600080fd5b50565b600081359050610a04816109de565b92915050565b6000819050919050565b610a1d81610a0a565b8114610a2857600080fd5b50565b600081359050610a3a81610a14565b92915050565b60008060408385031215610a5757610a566109a7565b5b6000610a65858286016109f5565b9250506020610a7685828601610a2b565b9150509250929050565b60008115159050919050565b610a9581610a80565b82525050565b6000602082019050610ab06000830184610a8c565b92915050565b610abf81610a0a565b82525050565b6000602082019050610ada6000830184610ab6565b92915050565b600080600060608486031215610af957610af86109a7565b5b6000610b07868287016109f5565b9350506020610b18868287016109f5565b9250506040610b2986828701610a2b565b9150509250925092565b600060ff82169050919050565b610b4981610b33565b82525050565b6000602082019050610b646000830184610b40565b92915050565b600060208284031215610b8057610b7f6109a7565b5b6000610b8e848285016109f5565b91505092915050565b60008060408385031215610bae57610bad6109a7565b5b6000610bbc858286016109f5565b9250506020610bcd858286016109f5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610c1e57607f821691505b602082108103610c3157610c30610bd7565b5b50919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000610c6d601483610900565b9150610c7882610c37565b602082019050919050565b60006020820190508181036000830152610c9c81610c60565b9050919050565b7f416c6c6f77616e63652065786365656465640000000000000000000000000000600082015250565b6000610cd9601283610900565b9150610ce482610ca3565b602082019050919050565b60006020820190508181036000830152610d0881610ccc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610d4982610a0a565b9150610d5483610a0a565b9250828203905081811115610d6c57610d6b610d0f565b5b92915050565b6000610d7d82610a0a565b9150610d8883610a0a565b9250828201905080821115610da057610d9f610d0f565b5b9291505056fea26469706673582212205e5b4e6009202ed6a767ad753a94f511f3265595766d8b580fd95cba0711e5e364736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce5671461013457806370a082311461015257806395d89b4114610182578063a9059cbb146101a0578063dd62ed3e146101d057610093565b806306fdde0314610098578063095ea7b3146100b657806318160ddd146100e657806323b872dd14610104575b600080fd5b6100a0610200565b6040516100ad9190610985565b60405180910390f35b6100d060048036038101906100cb9190610a40565b61028e565b6040516100dd9190610a9b565b60405180910390f35b6100ee610380565b6040516100fb9190610ac5565b60405180910390f35b61011e60048036038101906101199190610ae0565b610386565b60405161012b9190610a9b565b60405180910390f35b61013c610678565b6040516101499190610b4f565b60405180910390f35b61016c60048036038101906101679190610b6a565b61068b565b6040516101799190610ac5565b60405180910390f35b61018a6106a3565b6040516101979190610985565b60405180910390f35b6101ba60048036038101906101b59190610a40565b610731565b6040516101c79190610a9b565b60405180910390f35b6101ea60048036038101906101e59190610b97565b6108d0565b6040516101f79190610ac5565b60405180910390f35b6000805461020d90610c06565b80601f016020809104026020016040519081016040528092919081815260200182805461023990610c06565b80156102865780601f1061025b57610100808354040283529160200191610286565b820191906000526020600020905b81548152906001019060200180831161026957829003601f168201915b505050505081565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161036e9190610ac5565b60405180910390a36001905092915050565b60035481565b600081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561040a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040190610c83565b60405180910390fd5b81600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156104c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c090610cef565b60405180910390fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546105189190610d3e565b9250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461056e9190610d72565b9250508190555081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106019190610d3e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516106659190610ac5565b60405180910390a3600190509392505050565b600260009054906101000a900460ff1681565b60046020528060005260406000206000915090505481565b600180546106b090610c06565b80601f01602080910402602001604051908101604052809291908181526020018280546106dc90610c06565b80156107295780601f106106fe57610100808354040283529160200191610729565b820191906000526020600020905b81548152906001019060200180831161070c57829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156107b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ac90610c83565b60405180910390fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108049190610d3e565b9250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461085a9190610d72565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108be9190610ac5565b60405180910390a36001905092915050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600081519050919050565b600082825260208201905092915050565b60005b8381101561092f578082015181840152602081019050610914565b60008484015250505050565b6000601f19601f8301169050919050565b6000610957826108f5565b6109618185610900565b9350610971818560208601610911565b61097a8161093b565b840191505092915050565b6000602082019050818103600083015261099f818461094c565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006109d7826109ac565b9050919050565b6109e7816109cc565b81146109f257600080fd5b50565b600081359050610a04816109de565b92915050565b6000819050919050565b610a1d81610a0a565b8114610a2857600080fd5b50565b600081359050610a3a81610a14565b92915050565b60008060408385031215610a5757610a566109a7565b5b6000610a65858286016109f5565b9250506020610a7685828601610a2b565b9150509250929050565b60008115159050919050565b610a9581610a80565b82525050565b6000602082019050610ab06000830184610a8c565b92915050565b610abf81610a0a565b82525050565b6000602082019050610ada6000830184610ab6565b92915050565b600080600060608486031215610af957610af86109a7565b5b6000610b07868287016109f5565b9350506020610b18868287016109f5565b9250506040610b2986828701610a2b565b9150509250925092565b600060ff82169050919050565b610b4981610b33565b82525050565b6000602082019050610b646000830184610b40565b92915050565b600060208284031215610b8057610b7f6109a7565b5b6000610b8e848285016109f5565b91505092915050565b60008060408385031215610bae57610bad6109a7565b5b6000610bbc858286016109f5565b9250506020610bcd858286016109f5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610c1e57607f821691505b602082108103610c3157610c30610bd7565b5b50919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000610c6d601483610900565b9150610c7882610c37565b602082019050919050565b60006020820190508181036000830152610c9c81610c60565b9050919050565b7f416c6c6f77616e63652065786365656465640000000000000000000000000000600082015250565b6000610cd9601283610900565b9150610ce482610ca3565b602082019050919050565b60006020820190508181036000830152610d0881610ccc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610d4982610a0a565b9150610d5483610a0a565b9250828203905081811115610d6c57610d6b610d0f565b5b92915050565b6000610d7d82610a0a565b9150610d8883610a0a565b9250828201905080821115610da057610d9f610d0f565b5b9291505056fea26469706673582212205e5b4e6009202ed6a767ad753a94f511f3265595766d8b580fd95cba0711e5e364736f6c63430008140033", + "bytecode": "0x608060405234610133576100135f54610137565b601f81116100ec575b507f4d7920546f6b656e0000000000000000000000000000000000000000000000105f5560015461004c90610137565b601f81116100a4575b6006624d544b60e81b01600155601260ff19600254161760025569d3c21bcecceda1000000600355335f52600460205269d3c21bcecceda100000060405f205560405161068390816101708239f35b60015f52601f0160051c7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6908101905b8181106100e15750610055565b5f81556001016100d4565b5f8052601f0160051c7f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563908101905b818110610128575061001c565b5f815560010161011b565b5f80fd5b90600182811c92168015610165575b602083101461015157565b634e487b7160e01b5f52602260045260245ffd5b91607f169161014656fe60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146104b4578063095ea7b31461043b57806318160ddd1461041e57806323b872dd146102ed578063313ce567146102cd57806370a082311461029557806395d89b4114610177578063a9059cbb146100d05763dd62ed3e1461007c575f80fd5b346100cc5760403660031901126100cc576100956105b0565b61009d6105c6565b6001600160a01b039182165f908152600560209081526040808320949093168252928352819020549051908152f35b5f80fd5b346100cc5760403660031901126100cc576100e96105b0565b60243590335f5260046020526101058260405f205410156105dc565b335f52600460205260405f2061011c83825461061f565b905560018060a01b031690815f52600460205260405f2061013e828254610640565b90556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203392a3602060405160018152f35b346100cc575f3660031901126100cc576040515f6001548060011c9060018116801561028b575b6020831081146102775782855290811561025b5750600114610205575b50819003601f01601f191681019067ffffffffffffffff8211818310176101f157604082905281906101ed9082610586565b0390f35b634e487b7160e01b5f52604160045260245ffd5b60015f9081529091507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b828210610245575060209150820101826101bb565b6001816020925483858801015201910190610230565b90506020925060ff191682840152151560051b820101826101bb565b634e487b7160e01b5f52602260045260245ffd5b91607f169161019e565b346100cc5760203660031901126100cc576001600160a01b036102b66105b0565b165f526004602052602060405f2054604051908152f35b346100cc575f3660031901126100cc57602060ff60025416604051908152f35b346100cc5760603660031901126100cc576103066105b0565b61030e6105c6565b6044359160018060a01b031690815f5260046020526103338360405f205410156105dc565b5f82815260056020908152604080832033845290915290205483116103e45760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91835f526004825260405f2061038c86825461061f565b905560018060a01b031693845f526004825260405f206103ad828254610640565b90555f8481526005835260408082203383528452902080546103d090839061061f565b9055604051908152a3602060405160018152f35b60405162461bcd60e51b8152602060048201526012602482015271105b1b1bddd85b98d948195e18d95959195960721b6044820152606490fd5b346100cc575f3660031901126100cc576020600354604051908152f35b346100cc5760403660031901126100cc576104546105b0565b335f8181526005602090815260408083206001600160a01b03909516808452948252918290206024359081905591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a3602060405160018152f35b346100cc575f3660031901126100cc576040515f80548060011c9060018116801561057c575b6020831081146102775782855290811561025b57506001146105285750819003601f01601f191681019067ffffffffffffffff8211818310176101f157604082905281906101ed9082610586565b5f8080529091507f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b828210610566575060209150820101826101bb565b6001816020925483858801015201910190610551565b91607f16916104da565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100cc57565b602435906001600160a01b03821682036100cc57565b156105e357565b60405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606490fd5b9190820391821161062c57565b634e487b7160e01b5f52601160045260245ffd5b9190820180921161062c5756fea2646970667358221220b64532475550ebd64d5429b94457719e98bfb9ef20ce010d04e3299c0eb4d0e664736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146104b4578063095ea7b31461043b57806318160ddd1461041e57806323b872dd146102ed578063313ce567146102cd57806370a082311461029557806395d89b4114610177578063a9059cbb146100d05763dd62ed3e1461007c575f80fd5b346100cc5760403660031901126100cc576100956105b0565b61009d6105c6565b6001600160a01b039182165f908152600560209081526040808320949093168252928352819020549051908152f35b5f80fd5b346100cc5760403660031901126100cc576100e96105b0565b60243590335f5260046020526101058260405f205410156105dc565b335f52600460205260405f2061011c83825461061f565b905560018060a01b031690815f52600460205260405f2061013e828254610640565b90556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203392a3602060405160018152f35b346100cc575f3660031901126100cc576040515f6001548060011c9060018116801561028b575b6020831081146102775782855290811561025b5750600114610205575b50819003601f01601f191681019067ffffffffffffffff8211818310176101f157604082905281906101ed9082610586565b0390f35b634e487b7160e01b5f52604160045260245ffd5b60015f9081529091507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b828210610245575060209150820101826101bb565b6001816020925483858801015201910190610230565b90506020925060ff191682840152151560051b820101826101bb565b634e487b7160e01b5f52602260045260245ffd5b91607f169161019e565b346100cc5760203660031901126100cc576001600160a01b036102b66105b0565b165f526004602052602060405f2054604051908152f35b346100cc575f3660031901126100cc57602060ff60025416604051908152f35b346100cc5760603660031901126100cc576103066105b0565b61030e6105c6565b6044359160018060a01b031690815f5260046020526103338360405f205410156105dc565b5f82815260056020908152604080832033845290915290205483116103e45760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91835f526004825260405f2061038c86825461061f565b905560018060a01b031693845f526004825260405f206103ad828254610640565b90555f8481526005835260408082203383528452902080546103d090839061061f565b9055604051908152a3602060405160018152f35b60405162461bcd60e51b8152602060048201526012602482015271105b1b1bddd85b98d948195e18d95959195960721b6044820152606490fd5b346100cc575f3660031901126100cc576020600354604051908152f35b346100cc5760403660031901126100cc576104546105b0565b335f8181526005602090815260408083206001600160a01b03909516808452948252918290206024359081905591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a3602060405160018152f35b346100cc575f3660031901126100cc576040515f80548060011c9060018116801561057c575b6020831081146102775782855290811561025b57506001146105285750819003601f01601f191681019067ffffffffffffffff8211818310176101f157604082905281906101ed9082610586565b5f8080529091507f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b828210610566575060209150820101826101bb565b6001816020925483858801015201910190610551565b91607f16916104da565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100cc57565b602435906001600160a01b03821682036100cc57565b156105e357565b60405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606490fd5b9190820391821161062c57565b634e487b7160e01b5f52601160045260245ffd5b9190820180921161062c5756fea2646970667358221220b64532475550ebd64d5429b94457719e98bfb9ef20ce010d04e3299c0eb4d0e664736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/tests/contracts/account_abstraction/tokens/SimpleERC20.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/tests/integration/precompiles/bank/test_query.go b/tests/integration/precompiles/bank/test_query.go index d7dc3a0e4..2dfcb4a20 100644 --- a/tests/integration/precompiles/bank/test_query.go +++ b/tests/integration/precompiles/bank/test_query.go @@ -6,6 +6,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/cosmos/evm/precompiles/bank" + cmn "github.com/cosmos/evm/precompiles/common" + precompiletestutil "github.com/cosmos/evm/precompiles/testutil" "github.com/cosmos/evm/testutil/integration/evm/network" cosmosevmutiltx "github.com/cosmos/evm/testutil/tx" @@ -24,7 +26,7 @@ func (s *PrecompileTestSuite) TestBalances() { name string malleate func() []interface{} expPass bool - errContains string + wantErr error expBalances func(cosmosEVMAddr, xmplAddr common.Address) []bank.Balance }{ { @@ -35,7 +37,7 @@ func (s *PrecompileTestSuite) TestBalances() { } }, false, - "invalid number of arguments", + cmn.NewRevertWithSolidityError(bank.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(2)), nil, }, { @@ -46,7 +48,7 @@ func (s *PrecompileTestSuite) TestBalances() { } }, false, - "invalid type for account", + cmn.NewRevertWithSolidityError(bank.ABI, cmn.SolidityErrInvalidAddress, "random text"), nil, }, { @@ -57,7 +59,7 @@ func (s *PrecompileTestSuite) TestBalances() { } }, true, - "", + nil, func(common.Address, common.Address) []bank.Balance { return []bank.Balance{} }, }, { @@ -68,7 +70,7 @@ func (s *PrecompileTestSuite) TestBalances() { } }, true, - "", + nil, func(cosmosEVMAddr, xmplAddr common.Address) []bank.Balance { return []bank.Balance{ { @@ -91,7 +93,7 @@ func (s *PrecompileTestSuite) TestBalances() { } }, true, - "", + nil, func(cosmosEVMAddr, xmplAddr common.Address) []bank.Balance { return []bank.Balance{{ ContractAddress: cosmosEVMAddr, @@ -108,11 +110,8 @@ func (s *PrecompileTestSuite) TestBalances() { s.Run(tc.name, func() { ctx = s.SetupTest() // reset the chain each test - bz, err := s.precompile.Balances( - ctx, - &method, - tc.malleate(), - ) + args := tc.malleate() + bz, err := s.precompile.Balances(ctx, &method, args) if tc.expPass { s.Require().NoError(err) @@ -121,7 +120,9 @@ func (s *PrecompileTestSuite) TestBalances() { s.Require().NoError(err) s.Require().Equal(tc.expBalances(s.cosmosEVMAddr, s.xmplAddr), balances) } else { - s.Require().Contains(err.Error(), tc.errContains) + s.Require().Error(err) + s.Require().NotNil(tc.wantErr) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErr) } }) } @@ -190,11 +191,11 @@ func (s *PrecompileTestSuite) TestSupplyOf() { xmplTotalSupply := totSupplRes.Supply.AmountOf(s.tokenDenom) testcases := []struct { - name string - malleate func() []interface{} - expErr bool - errContains string - expSupply *big.Int + name string + malleate func() []interface{} + expErr bool + wantErr error + expSupply *big.Int }{ { "fail - invalid number of arguments", @@ -204,7 +205,7 @@ func (s *PrecompileTestSuite) TestSupplyOf() { } }, true, - "invalid number of arguments", + cmn.NewRevertWithSolidityError(bank.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(3)), nil, }, { @@ -215,7 +216,7 @@ func (s *PrecompileTestSuite) TestSupplyOf() { } }, true, - "invalid type for erc20Address", + cmn.NewRevertWithSolidityError(bank.ABI, cmn.SolidityErrInvalidAddress, "random text"), nil, }, { @@ -226,7 +227,7 @@ func (s *PrecompileTestSuite) TestSupplyOf() { } }, false, - "", + nil, big.NewInt(0), }, { @@ -237,7 +238,7 @@ func (s *PrecompileTestSuite) TestSupplyOf() { } }, false, - "", + nil, xmplTotalSupply.BigInt(), }, @@ -249,7 +250,7 @@ func (s *PrecompileTestSuite) TestSupplyOf() { } }, false, - "", + nil, cosmosEVMTotalSupply.BigInt(), }, } @@ -258,15 +259,13 @@ func (s *PrecompileTestSuite) TestSupplyOf() { s.Run(tc.name, func() { ctx := s.SetupTest() - bz, err := s.precompile.SupplyOf( - ctx, - &method, - tc.malleate(), - ) + args := tc.malleate() + bz, err := s.precompile.SupplyOf(ctx, &method, args) if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErr) } else { out, err := method.Outputs.Unpack(bz) s.Require().NoError(err, "expected no error unpacking") diff --git a/tests/integration/precompiles/bech32/test_bech32.go b/tests/integration/precompiles/bech32/test_bech32.go index b03d1182d..fdeaf36c8 100644 --- a/tests/integration/precompiles/bech32/test_bech32.go +++ b/tests/integration/precompiles/bech32/test_bech32.go @@ -1,13 +1,20 @@ package bech32 import ( + "errors" + "fmt" + "math/big" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" "github.com/holiman/uint256" "github.com/cosmos/evm/precompiles/bech32" + cmn "github.com/cosmos/evm/precompiles/common" sdk "github.com/cosmos/cosmos-sdk/types" + statedbmocks "github.com/cosmos/evm/x/vm/statedb/mocks" ) func (s *PrecompileTestSuite) TestNewPrecompile() { @@ -59,11 +66,11 @@ func (s *PrecompileTestSuite) TestRun() { ) testCases := []struct { - name string - malleate func() *vm.Contract - postCheck func(data []byte) - expPass bool - errContains string + name string + malleate func() *vm.Contract + postCheck func(data []byte) + expPass bool + wantErr error }{ { "fail - invalid method", @@ -73,7 +80,7 @@ func (s *PrecompileTestSuite) TestRun() { }, func([]byte) {}, false, - "no method with id", + cmn.NewRevertWithSolidityError(bech32.ABI, cmn.SolidityErrUnknownMethod, "0x696e7661"), }, { "fail - error during unpack", @@ -84,7 +91,7 @@ func (s *PrecompileTestSuite) TestRun() { }, func([]byte) {}, false, - "abi: attempting to unmarshal an empty string while arguments are expected", + cmn.NewRevertWithSolidityError(bech32.ABI, cmn.SolidityErrABISetupFailed, "abi: attempting to unmarshal an empty string while arguments are expected"), }, { "fail - HexToBech32 method error", @@ -102,7 +109,16 @@ func (s *PrecompileTestSuite) TestRun() { }, func([]byte) {}, false, - "invalid bech32 human readable prefix (HRP)", + cmn.NewRevertWithSolidityError( + bech32.ABI, + cmn.SolidityErrInvalidAddress, + fmt.Sprintf( + "invalid HRP: empty; expected account (%s), validator (%s), or consensus (%s) style prefix", + sdk.GetConfig().GetBech32AccountAddrPrefix(), + sdk.GetConfig().GetBech32ValidatorAddrPrefix(), + sdk.GetConfig().GetBech32ConsensusAddrPrefix(), + ), + ), }, { "pass - hex to bech32 account (cosmos)", @@ -125,7 +141,7 @@ func (s *PrecompileTestSuite) TestRun() { s.Require().Equal(s.keyring.GetAccAddr(0).String(), addr) }, true, - "", + nil, }, { "pass - hex to bech32 validator operator (cosmosvaloper)", @@ -151,7 +167,7 @@ func (s *PrecompileTestSuite) TestRun() { s.Require().Equal(s.network.GetValidators()[0].OperatorAddress, addr) }, true, - "", + nil, }, { "pass - hex to bech32 consensus address (cosmosvalcons)", @@ -174,7 +190,7 @@ func (s *PrecompileTestSuite) TestRun() { s.Require().Equal(sdk.ConsAddress(s.keyring.GetAddr(0).Bytes()).String(), addr) }, true, - "", + nil, }, { "pass - bech32 to hex account address", @@ -196,7 +212,7 @@ func (s *PrecompileTestSuite) TestRun() { s.Require().Equal(s.keyring.GetAddr(0), addr) }, true, - "", + nil, }, { "pass - bech32 to hex validator address", @@ -222,7 +238,7 @@ func (s *PrecompileTestSuite) TestRun() { s.Require().Equal(common.BytesToAddress(valAddrBz), addr) }, true, - "", + nil, }, { "pass - bech32 to hex consensus address", @@ -244,7 +260,7 @@ func (s *PrecompileTestSuite) TestRun() { s.Require().Equal(s.keyring.GetAddr(0), addr) }, true, - "", + nil, }, } @@ -257,10 +273,9 @@ func (s *PrecompileTestSuite) TestRun() { contract := tc.malleate() // Run precompiled contract - - // NOTE: we can ignore the EVM and readonly args since it's a stateless - // precompiled contract - bz, err := s.precompile.Run(nil, contract, true) + stateDB := statedbmocks.NewStateDB(s.T()) + evm := vm.NewEVM(vm.BlockContext{BlockNumber: big.NewInt(1), Time: 1}, stateDB, params.TestChainConfig, vm.Config{}) + bz, err := s.precompile.Run(evm, contract, true) // Check results if tc.expPass { @@ -269,8 +284,12 @@ func (s *PrecompileTestSuite) TestRun() { tc.postCheck(bz) } else { s.Require().Error(err, "expected error to be returned when running the precompile") - s.Require().Nil(bz, "expected returned bytes to be nil") - s.Require().ErrorContains(err, tc.errContains) + s.Require().NotNil(tc.wantErr) + s.Require().ErrorIs(err, vm.ErrExecutionReverted) + s.Require().NotNil(bz, "expected revert payload bytes") + var wantCarrier cmn.RevertDataCarrier + s.Require().True(errors.As(tc.wantErr, &wantCarrier)) + s.Require().Equal(wantCarrier.RevertData(), bz) } }) } diff --git a/tests/integration/precompiles/bech32/test_methods.go b/tests/integration/precompiles/bech32/test_methods.go index 4b0cef4b1..dc92b7e41 100644 --- a/tests/integration/precompiles/bech32/test_methods.go +++ b/tests/integration/precompiles/bech32/test_methods.go @@ -2,11 +2,13 @@ package bech32 import ( "fmt" + "math/big" "github.com/ethereum/go-ethereum/common" "github.com/cosmos/evm/precompiles/bech32" cmn "github.com/cosmos/evm/precompiles/common" + precompiletestutil "github.com/cosmos/evm/precompiles/testutil" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -18,11 +20,11 @@ func (s *PrecompileTestSuite) TestHexToBech32() { method := s.precompile.Methods[bech32.HexToBech32Method] testCases := []struct { - name string - malleate func() []interface{} - postCheck func(data []byte) - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func(data []byte) + expError bool + wantErr error }{ { "fail - invalid args length", @@ -31,7 +33,7 @@ func (s *PrecompileTestSuite) TestHexToBech32() { }, func([]byte) {}, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + cmn.NewRevertWithSolidityError(bech32.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { "fail - invalid hex address", @@ -43,7 +45,7 @@ func (s *PrecompileTestSuite) TestHexToBech32() { }, func([]byte) {}, true, - "invalid hex address", + cmn.NewRevertWithSolidityError(bech32.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "fail - invalid bech32 HRP", @@ -55,7 +57,16 @@ func (s *PrecompileTestSuite) TestHexToBech32() { }, func([]byte) {}, true, - "invalid bech32 human readable prefix (HRP)", + cmn.NewRevertWithSolidityError( + bech32.ABI, + cmn.SolidityErrInvalidAddress, + fmt.Sprintf( + "invalid HRP: empty; expected account (%s), validator (%s), or consensus (%s) style prefix", + sdk.GetConfig().GetBech32AccountAddrPrefix(), + sdk.GetConfig().GetBech32ValidatorAddrPrefix(), + sdk.GetConfig().GetBech32ConsensusAddrPrefix(), + ), + ), }, { "pass - valid hex address and valid bech32 HRP", @@ -74,7 +85,7 @@ func (s *PrecompileTestSuite) TestHexToBech32() { s.Require().Equal(s.keyring.GetAccAddr(0).String(), addr) }, false, - "", + nil, }, } @@ -86,7 +97,8 @@ func (s *PrecompileTestSuite) TestHexToBech32() { if tc.expError { s.Require().Error(err) - s.Require().ErrorContains(err, tc.errContains, err.Error()) + s.Require().NotNil(tc.wantErr) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErr) s.Require().Empty(bz) } else { s.Require().NoError(err) @@ -104,11 +116,11 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { method := s.precompile.Methods[bech32.Bech32ToHexMethod] testCases := []struct { - name string - malleate func() []interface{} - postCheck func(data []byte) - expError bool - errContains func() string + name string + malleate func() []interface{} + postCheck func(data []byte) + expError bool + wantErr func() error }{ { "fail - invalid args length", @@ -117,8 +129,8 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { }, func([]byte) {}, true, - func() string { - return fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0) + func() error { + return cmn.NewRevertWithSolidityError(bech32.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)) }, }, { @@ -130,8 +142,8 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { }, func([]byte) {}, true, - func() string { - return "invalid bech32 address" + func() error { + return cmn.NewRevertWithSolidityError(bech32.ABI, cmn.SolidityErrInvalidAddress, "") }, }, { @@ -143,8 +155,8 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { }, func([]byte) {}, true, - func() string { - return fmt.Sprintf("invalid bech32 address: %s", "cosmos") + func() error { + return cmn.NewRevertWithSolidityError(bech32.ABI, cmn.SolidityErrInvalidAddress, "cosmos") }, }, { @@ -156,8 +168,11 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { }, func([]byte) {}, true, - func() string { - return "decoding bech32 failed" + func() error { + // Keep exact match but derive the sdk error message from the same call path. + _, err := sdk.GetFromBech32("cosmos1", "cosmos") + s.Require().Error(err) + return cmn.NewRevertWithSolidityError(bech32.ABI, cmn.SolidityErrQueryFailed, bech32.Bech32ToHexMethod, err.Error()) }, }, { @@ -169,12 +184,12 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { }, func([]byte) {}, true, - func() string { - if addrVerifier := sdk.GetConfig().GetAddressVerifier(); addrVerifier != nil { - err := addrVerifier(sdk.AccAddress(make([]byte, 256))) - return err.Error() - } - return "address max length is 255" + func() error { + // VerifyAddressFormat error depends on configured verifier; derive dynamically. + addressBz := sdk.AccAddress(make([]byte, 256)) + err := sdk.VerifyAddressFormat(addressBz) + s.Require().Error(err) + return cmn.NewRevertWithSolidityError(bech32.ABI, cmn.SolidityErrInvalidAddress, err.Error()) }, }, { @@ -193,9 +208,7 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { s.Require().Equal(s.keyring.GetAddr(0), addr) }, false, - func() string { - return "" - }, + nil, }, } @@ -207,7 +220,8 @@ func (s *PrecompileTestSuite) TestBech32ToHex() { if tc.expError { s.Require().Error(err) - s.Require().ErrorContains(err, tc.errContains()) + s.Require().NotNil(tc.wantErr) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErr()) s.Require().Empty(bz) } else { s.Require().NoError(err) diff --git a/tests/integration/precompiles/distribution/test_distribution.go b/tests/integration/precompiles/distribution/test_distribution.go index 62f827248..d0d7a2604 100644 --- a/tests/integration/precompiles/distribution/test_distribution.go +++ b/tests/integration/precompiles/distribution/test_distribution.go @@ -75,11 +75,11 @@ func (s *PrecompileTestSuite) TestRun() { err error ) testcases := []struct { - name string - malleate func() (common.Address, []byte) - readOnly bool - expPass bool - errContains string + name string + malleate func() (common.Address, []byte) + readOnly bool + expPass bool + wantErr error }{ { name: "pass - set withdraw address transaction", @@ -290,7 +290,7 @@ func (s *PrecompileTestSuite) TestRun() { } else { s.Require().Error(err, "expected error to be returned when running the precompile") s.Require().Nil(bz, "expected returned bytes to be nil") - s.Require().ErrorContains(err, tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } }) } @@ -302,10 +302,10 @@ func (s *PrecompileTestSuite) TestCMS() { err error ) testcases := []struct { - name string - malleate func() (common.Address, []byte) - expPass bool - errContains string + name string + malleate func() (common.Address, []byte) + expPass bool + wantErr error }{ { name: "pass - set withdraw address transaction", @@ -513,7 +513,7 @@ func (s *PrecompileTestSuite) TestCMS() { } else { s.Require().Error(err, "expected error to be returned when running the precompile") s.Require().Nil(resp.Ret, "expected returned bytes to be nil") - s.Require().ErrorContains(err, tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) // NOTES: After stack-based snapshot mechanism is added for precompile call, // CacheMultiStore.Write() is not called when tx fails. testutil.ValidateWrites(s.T(), cms, 0) diff --git a/tests/integration/precompiles/distribution/test_event.go b/tests/integration/precompiles/distribution/test_event.go index ce73fc511..23b183ece 100644 --- a/tests/integration/precompiles/distribution/test_event.go +++ b/tests/integration/precompiles/distribution/test_event.go @@ -29,12 +29,12 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddressEvent() { ) method := s.precompile.Methods[distribution.SetWithdrawAddressMethod] testCases := []struct { - name string - malleate func(operatorAddress string) []interface{} - postCheck func() - gas uint64 - expError bool - errContains string + name string + malleate func(operatorAddress string) []interface{} + postCheck func() + gas uint64 + expError bool + wantErr error }{ { "success - the correct event is emitted", @@ -63,7 +63,7 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddressEvent() { }, 20000, false, - "", + nil, }, } @@ -81,7 +81,7 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddressEvent() { if tc.expError { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck() @@ -96,12 +96,12 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorRewardEvent() { ) method := s.precompile.Methods[distribution.WithdrawDelegatorRewardMethod] testCases := []struct { - name string - malleate func(val stakingtypes.Validator) []interface{} - postCheck func() - gas uint64 - expError bool - errContains string + name string + malleate func(val stakingtypes.Validator) []interface{} + postCheck func() + gas uint64 + expError bool + wantErr error }{ { "success - the correct event is emitted", @@ -142,7 +142,7 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorRewardEvent() { }, 20000, false, - "", + nil, }, } @@ -160,7 +160,7 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorRewardEvent() { if tc.expError { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck() @@ -176,12 +176,12 @@ func (s *PrecompileTestSuite) TestWithdrawValidatorCommissionEvent() { ) method := s.precompile.Methods[distribution.WithdrawValidatorCommissionMethod] testCases := []struct { - name string - malleate func(operatorAddress string) []interface{} - postCheck func() - gas uint64 - expError bool - errContains string + name string + malleate func(operatorAddress string) []interface{} + postCheck func() + gas uint64 + expError bool + wantErr error }{ { "success - the correct event is emitted", @@ -219,7 +219,7 @@ func (s *PrecompileTestSuite) TestWithdrawValidatorCommissionEvent() { }, 20000, false, - "", + nil, }, } @@ -240,7 +240,7 @@ func (s *PrecompileTestSuite) TestWithdrawValidatorCommissionEvent() { if tc.expError { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck() @@ -382,12 +382,12 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolEvent() { ) method := s.precompile.Methods[distribution.DepositValidatorRewardsPoolMethod] testCases := []struct { - name string - malleate func(operatorAddress string) ([]interface{}, sdk.Coins) - postCheck func(sdk.Coins) - gas uint64 - expError bool - errContains string + name string + malleate func(operatorAddress string) ([]interface{}, sdk.Coins) + postCheck func(sdk.Coins) + gas uint64 + expError bool + wantErr error }{ { "success - the correct event is emitted", @@ -430,7 +430,7 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolEvent() { }, 20000, false, - "", + nil, }, { "success - the correct event is emitted for multiple coins", @@ -482,7 +482,7 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolEvent() { }, 20000, false, - "", + nil, }, } @@ -499,7 +499,7 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolEvent() { if tc.expError { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck(sdkCoins) diff --git a/tests/integration/precompiles/distribution/test_integration.go b/tests/integration/precompiles/distribution/test_integration.go index 83d93860a..073f322bf 100644 --- a/tests/integration/precompiles/distribution/test_integration.go +++ b/tests/integration/precompiles/distribution/test_integration.go @@ -1,7 +1,6 @@ package distribution import ( - "fmt" "math/big" "testing" @@ -120,8 +119,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp differentAddr, s.keyring.GetAddr(0).String(), } - - withdrawAddrSetCheck := defaultLogCheck.WithErrContains(cmn.ErrRequesterIsNotMsgSender, s.keyring.GetAddr(0).String(), differentAddr.String()) + withdrawAddrSetCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(0), + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), @@ -181,12 +185,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp differentAddr, s.network.GetValidators()[0].OperatorAddress, } - - withdrawalCheck := defaultLogCheck.WithErrContains( - cmn.ErrRequesterIsNotMsgSender, - s.keyring.GetAddr(0).String(), - differentAddr.String(), - ) + withdrawalCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(0), + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), @@ -428,10 +433,15 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp callArgs.Args = []interface{}{ s.network.GetValidators()[0].OperatorAddress, } - validatorHexAddr := common.BytesToAddress(s.validatorsKeys[0].AccAddr) - withdrawalCheck := defaultLogCheck.WithErrContains(cmn.ErrRequesterIsNotMsgSender, s.keyring.GetAddr(0).String(), validatorHexAddr.String()) + withdrawalCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(0), + validatorHexAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), @@ -587,8 +597,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp callArgs.Args = []interface{}{ differentAddr, uint32(1), } - - claimRewardsCheck := defaultLogCheck.WithErrContains(cmn.ErrRequesterIsNotMsgSender, s.keyring.GetAddr(0).String(), differentAddr.String()) + claimRewardsCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(0), + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), @@ -662,11 +677,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp }, } - failureCheck := defaultLogCheck.WithErrContains( - cmn.ErrRequesterIsNotMsgSender, - s.keyring.GetAddr(0).String(), - differentAddr, - ) + failureCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(0), + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), // tx from Addr0 @@ -688,7 +705,8 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp []cmn.Coin{{Denom: s.bondDenom, Amount: excessAmount.BigInt()}}, } - failureCheck := defaultLogCheck.WithErrContains("insufficient funds") + // Revert reason is ABI-encoded MsgServerFailed; err chain may be estimate-gas or broadcast path. + failureCheck := defaultLogCheck.WithErrContains("execution reverted") _, _, err = s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), @@ -819,8 +837,8 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp }, } - // We expect the tx to fail ("execution reverted") because of insufficient funds - insufficientFundsCheck := defaultLogCheck.WithErrContains("insufficient funds") + // Gas estimation or execution may surface only "execution reverted" plus hex-encoded MsgServerFailed. + insufficientFundsCheck := defaultLogCheck.WithErrContains("execution reverted") _, _, err = s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), @@ -1512,12 +1530,12 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp callArgs.Args = []interface{}{ differentAddr, s.network.GetValidators()[0].OperatorAddress, } - - revertReasonCheck := execRevertedCheck.WithErrNested( - cmn.ErrRequesterIsNotMsgSender, + revertReasonCheck := execRevertedCheck.WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, contractAddr, - differentAddr.String(), - ) + differentAddr, + )) res, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), @@ -2099,11 +2117,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp It("should not claim rewards when sending from a different address", func() { callArgs.Args = []interface{}{differentAddr, uint32(1)} - errCheckArgs := defaultLogCheck.WithErrContains(fmt.Errorf( - cmn.ErrRequesterIsNotMsgSender, - txArgs.To, - differentAddr, - ).Error()) + errCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + contractAddr, + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), @@ -2662,11 +2682,12 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp differentAddr.String(), differentAddr, s.network.GetValidators()[0].OperatorAddress, } - revertReasonCheck := execRevertedCheck.WithErrNested( - cmn.ErrRequesterIsNotMsgSender, + revertReasonCheck := execRevertedCheck.WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, contractAddr, s.keyring.GetAddr(0), - ) + )) _, _, err = s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), diff --git a/tests/integration/precompiles/distribution/test_query.go b/tests/integration/precompiles/distribution/test_query.go index 75a25b485..5eda0ece1 100644 --- a/tests/integration/precompiles/distribution/test_query.go +++ b/tests/integration/precompiles/distribution/test_query.go @@ -1,13 +1,14 @@ package distribution import ( - "fmt" + "math/big" "github.com/ethereum/go-ethereum/core/vm" "github.com/holiman/uint256" cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/distribution" + precompiletestutil "github.com/cosmos/evm/precompiles/testutil" testutiltx "github.com/cosmos/evm/testutil/tx" "cosmossdk.io/math" @@ -22,37 +23,42 @@ import ( var expValAmount int64 = 1 type distrTestCases struct { - name string - malleate func() []interface{} - postCheck func(bz []byte) - gas uint64 - expErr bool - errContains string + name string + malleate func() []interface{} + postCheck func(bz []byte) + gas uint64 + expErr bool + wantErrFn func(*PrecompileTestSuite, []interface{}) error } -var baseTestCases = []distrTestCases{ - { - "fail - empty input args", - func() []interface{} { - return []interface{}{} - }, - func([]byte) {}, - 100000, - true, - "invalid number of arguments", - }, - { - "fail - invalid validator address", - func() []interface{} { - return []interface{}{ - "invalid", - } +func baseQueryTestCases(methodName string, expInputs int) []distrTestCases { + return []distrTestCases{ + { + "fail - empty input args", + func() []interface{} { return []interface{}{} }, + func([]byte) {}, + 100000, + true, + func(_ *PrecompileTestSuite, args []interface{}) error { + return cmn.NewRevertWithSolidityError( + distribution.ABI, + cmn.SolidityErrInvalidNumberOfArgs, + big.NewInt(int64(expInputs)), + big.NewInt(int64(len(args))), + ) + }, + }, + { + "fail - invalid validator address", + func() []interface{} { return []interface{}{"invalid"} }, + func([]byte) {}, + 100000, + true, + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, "invalid") + }, }, - func([]byte) {}, - 100000, - true, - "invalid: unknown address", - }, + } } func (s *PrecompileTestSuite) TestValidatorDistributionInfo() { @@ -73,7 +79,9 @@ func (s *PrecompileTestSuite) TestValidatorDistributionInfo() { func([]byte) {}, 100000, true, - "validator does not exist", + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrQueryFailed, method.Name, "validator does not exist") + }, }, { "fail - existent validator but without self delegation", @@ -85,7 +93,9 @@ func (s *PrecompileTestSuite) TestValidatorDistributionInfo() { func([]byte) {}, 100000, true, - "no delegation for (address, validator) tuple", + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrQueryFailed, method.Name, "no delegation for (address, validator) tuple") + }, }, { "success", @@ -120,10 +130,10 @@ func (s *PrecompileTestSuite) TestValidatorDistributionInfo() { }, 100000, false, - "", + nil, }, } - testCases = append(testCases, baseTestCases...) + testCases = append(baseQueryTestCases(method.Name, len(method.Inputs)), testCases...) for _, tc := range testCases { s.Run(tc.name, func() { @@ -131,11 +141,13 @@ func (s *PrecompileTestSuite) TestValidatorDistributionInfo() { ctx = s.network.GetContext() contract := vm.NewContract(s.keyring.GetAddr(0), s.precompile.Address(), uint256.NewInt(0), tc.gas, nil) - bz, err := s.precompile.ValidatorDistributionInfo(ctx, contract, &method, tc.malleate()) + args := tc.malleate() + bz, err := s.precompile.ValidatorDistributionInfo(ctx, contract, &method, args) if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErrFn) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } else { s.Require().NoError(err) s.Require().NotEmpty(bz) @@ -168,7 +180,9 @@ func (s *PrecompileTestSuite) TestValidatorOutstandingRewards() { }, 100000, true, - "validator does not exist", + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrQueryFailed, method.Name, "validator does not exist") + }, }, { "success - existent validator, no outstanding rewards", @@ -185,7 +199,7 @@ func (s *PrecompileTestSuite) TestValidatorOutstandingRewards() { }, 100000, false, - "", + nil, }, { "success - with outstanding rewards", @@ -213,10 +227,10 @@ func (s *PrecompileTestSuite) TestValidatorOutstandingRewards() { }, 100000, false, - "", + nil, }, } - testCases = append(testCases, baseTestCases...) + testCases = append(baseQueryTestCases(method.Name, len(method.Inputs)), testCases...) for _, tc := range testCases { s.Run(tc.name, func() { @@ -224,11 +238,13 @@ func (s *PrecompileTestSuite) TestValidatorOutstandingRewards() { ctx = s.network.GetContext() contract := vm.NewContract(s.keyring.GetAddr(0), s.precompile.Address(), uint256.NewInt(0), tc.gas, nil) - bz, err := s.precompile.ValidatorOutstandingRewards(ctx, contract, &method, tc.malleate()) + args := tc.malleate() + bz, err := s.precompile.ValidatorOutstandingRewards(ctx, contract, &method, args) if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErrFn) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } else { s.Require().NoError(err) s.Require().NotEmpty(bz) @@ -261,7 +277,9 @@ func (s *PrecompileTestSuite) TestValidatorCommission() { }, 100000, true, - "validator does not exist", + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrQueryFailed, method.Name, "validator does not exist") + }, }, { "success - existent validator, no accumulated commission", @@ -278,7 +296,7 @@ func (s *PrecompileTestSuite) TestValidatorCommission() { }, 100000, false, - "", + nil, }, { "success - with accumulated commission", @@ -311,10 +329,10 @@ func (s *PrecompileTestSuite) TestValidatorCommission() { }, 100000, false, - "", + nil, }, } - testCases = append(testCases, baseTestCases...) + testCases = append(baseQueryTestCases(method.Name, len(method.Inputs)), testCases...) for _, tc := range testCases { s.Run(tc.name, func() { @@ -322,11 +340,13 @@ func (s *PrecompileTestSuite) TestValidatorCommission() { ctx = s.network.GetContext() contract := vm.NewContract(s.keyring.GetAddr(0), s.precompile.Address(), uint256.NewInt(0), tc.gas, nil) - bz, err := s.precompile.ValidatorCommission(ctx, contract, &method, tc.malleate()) + args := tc.malleate() + bz, err := s.precompile.ValidatorCommission(ctx, contract, &method, args) if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErrFn) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } else { s.Require().NoError(err) s.Require().NotEmpty(bz) @@ -352,7 +372,9 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { }, 100000, true, - "invalid validator address", + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrQueryFailed, method.Name, "rpc error: code = InvalidArgument desc = invalid validator address") + }, }, { "fail - invalid starting height type", @@ -367,7 +389,9 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { }, 100000, true, - "invalid type for startingHeight: expected uint64, received int64", + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidHeight, "1") + }, }, { "fail - starting height greater than ending height", @@ -382,7 +406,9 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { }, 100000, true, - "starting height greater than ending height", + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrQueryFailed, method.Name, "rpc error: code = InvalidArgument desc = starting height greater than ending height (6 > 5)") + }, }, { "success - nonexistent validator address", @@ -406,7 +432,7 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { }, 100000, false, - "", + nil, }, { "success - existent validator, no slashes", @@ -427,7 +453,7 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { }, 100000, false, - "", + nil, }, { "success - with slashes", @@ -453,7 +479,7 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { }, 100000, false, - "", + nil, }, { "success - with slashes w/pagination", @@ -480,10 +506,10 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { }, 100000, false, - "", + nil, }, } - testCases = append(testCases, baseTestCases[0]) + testCases = append([]distrTestCases{baseQueryTestCases(method.Name, len(method.Inputs))[0]}, testCases...) for _, tc := range testCases { s.Run(tc.name, func() { @@ -491,11 +517,13 @@ func (s *PrecompileTestSuite) TestValidatorSlashes() { ctx = s.network.GetContext() contract := vm.NewContract(s.keyring.GetAddr(0), s.precompile.Address(), uint256.NewInt(0), tc.gas, nil) - bz, err := s.precompile.ValidatorSlashes(ctx, contract, &method, tc.malleate()) + args := tc.malleate() + bz, err := s.precompile.ValidatorSlashes(ctx, contract, &method, args) if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErrFn) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } else { s.Require().NoError(err) s.Require().NotEmpty(bz) @@ -524,7 +552,9 @@ func (s *PrecompileTestSuite) TestDelegationRewards() { func([]byte) {}, 100000, true, - "invalid: unknown address", + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, "invalid") + }, }, { "fail - nonexistent validator address", @@ -540,7 +570,9 @@ func (s *PrecompileTestSuite) TestDelegationRewards() { func([]byte) {}, 100000, true, - "validator does not exist", + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrQueryFailed, method.Name, "validator does not exist") + }, }, { "fail - existent validator, no delegation", @@ -554,7 +586,9 @@ func (s *PrecompileTestSuite) TestDelegationRewards() { func([]byte) {}, 100000, true, - "no delegation for (address, validator) tuple", + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrQueryFailed, method.Name, "no delegation for (address, validator) tuple") + }, }, { "success - existent validator & delegation, but no rewards", @@ -572,7 +606,7 @@ func (s *PrecompileTestSuite) TestDelegationRewards() { }, 100000, false, - "", + nil, }, { "success - with rewards", @@ -595,10 +629,10 @@ func (s *PrecompileTestSuite) TestDelegationRewards() { }, 100000, false, - "", + nil, }, } - testCases = append(testCases, baseTestCases[0]) + testCases = append([]distrTestCases{baseQueryTestCases(method.Name, len(method.Inputs))[0]}, testCases...) for _, tc := range testCases { s.Run(tc.name, func() { @@ -611,7 +645,8 @@ func (s *PrecompileTestSuite) TestDelegationRewards() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErrFn) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } else { s.Require().NoError(err) s.Require().NotEmpty(bz) @@ -639,7 +674,9 @@ func (s *PrecompileTestSuite) TestDelegationTotalRewards() { func([]byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, "invalid") + }, }, { "success - no delegations", @@ -658,7 +695,7 @@ func (s *PrecompileTestSuite) TestDelegationTotalRewards() { }, 100000, false, - "", + nil, }, { "success - existent validator & delegation, but no rewards", @@ -683,7 +720,7 @@ func (s *PrecompileTestSuite) TestDelegationTotalRewards() { }, 100000, false, - "", + nil, }, { "success - with rewards", @@ -728,10 +765,10 @@ func (s *PrecompileTestSuite) TestDelegationTotalRewards() { }, 100000, false, - "", + nil, }, } - testCases = append(testCases, baseTestCases[0]) + testCases = append([]distrTestCases{baseQueryTestCases(method.Name, len(method.Inputs))[0]}, testCases...) for _, tc := range testCases { s.Run(tc.name, func() { @@ -745,7 +782,8 @@ func (s *PrecompileTestSuite) TestDelegationTotalRewards() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErrFn) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } else { s.Require().NoError(err) s.Require().NotEmpty(bz) @@ -770,7 +808,9 @@ func (s *PrecompileTestSuite) TestDelegatorValidators() { func([]byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, "invalid") + }, }, { "success - no delegations", @@ -788,7 +828,7 @@ func (s *PrecompileTestSuite) TestDelegatorValidators() { }, 100000, false, - "", + nil, }, { "success - existent delegations", @@ -813,10 +853,10 @@ func (s *PrecompileTestSuite) TestDelegatorValidators() { }, 100000, false, - "", + nil, }, } - testCases = append(testCases, baseTestCases[0]) + testCases = append([]distrTestCases{baseQueryTestCases(method.Name, len(method.Inputs))[0]}, testCases...) for _, tc := range testCases { s.Run(tc.name, func() { @@ -824,11 +864,13 @@ func (s *PrecompileTestSuite) TestDelegatorValidators() { ctx = s.network.GetContext() contract := vm.NewContract(s.keyring.GetAddr(0), s.precompile.Address(), uint256.NewInt(0), tc.gas, nil) - bz, err := s.precompile.DelegatorValidators(ctx, contract, &method, tc.malleate()) + args := tc.malleate() + bz, err := s.precompile.DelegatorValidators(ctx, contract, &method, args) if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErrFn) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } else { s.Require().NoError(err) s.Require().NotEmpty(bz) @@ -853,7 +895,9 @@ func (s *PrecompileTestSuite) TestDelegatorWithdrawAddress() { func([]byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, "invalid") + }, }, { "success - withdraw address same as delegator address", @@ -870,10 +914,10 @@ func (s *PrecompileTestSuite) TestDelegatorWithdrawAddress() { }, 100000, false, - "", + nil, }, } - testCases = append(testCases, baseTestCases[0]) + testCases = append([]distrTestCases{baseQueryTestCases(method.Name, len(method.Inputs))[0]}, testCases...) for _, tc := range testCases { s.Run(tc.name, func() { @@ -881,11 +925,13 @@ func (s *PrecompileTestSuite) TestDelegatorWithdrawAddress() { ctx = s.network.GetContext() contract := vm.NewContract(s.keyring.GetAddr(0), s.precompile.Address(), uint256.NewInt(0), tc.gas, nil) - bz, err := s.precompile.DelegatorWithdrawAddress(ctx, contract, &method, tc.malleate()) + args := tc.malleate() + bz, err := s.precompile.DelegatorWithdrawAddress(ctx, contract, &method, args) if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErrFn) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } else { s.Require().NoError(err) s.Require().NotEmpty(bz) @@ -910,7 +956,9 @@ func (s *PrecompileTestSuite) TestCommunityPool() { func(bz []byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 0, 1), + func(_ *PrecompileTestSuite, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(0), big.NewInt(1)) + }, }, { "success - empty community pool", @@ -925,7 +973,7 @@ func (s *PrecompileTestSuite) TestCommunityPool() { }, 100000, false, - "", + nil, }, { "success - with community pool", @@ -947,7 +995,7 @@ func (s *PrecompileTestSuite) TestCommunityPool() { }, 100000, false, - "", + nil, }, } @@ -957,11 +1005,13 @@ func (s *PrecompileTestSuite) TestCommunityPool() { ctx = s.network.GetContext() contract := vm.NewContract(s.keyring.GetAddr(0), s.precompile.Address(), uint256.NewInt(0), tc.gas, nil) - bz, err := s.precompile.CommunityPool(ctx, contract, &method, tc.malleate()) + args := tc.malleate() + bz, err := s.precompile.CommunityPool(ctx, contract, &method, args) if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErrFn) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } else { s.Require().NoError(err) s.Require().NotEmpty(bz) diff --git a/tests/integration/precompiles/distribution/test_tx.go b/tests/integration/precompiles/distribution/test_tx.go index 7de336190..92e1e608a 100644 --- a/tests/integration/precompiles/distribution/test_tx.go +++ b/tests/integration/precompiles/distribution/test_tx.go @@ -13,6 +13,7 @@ import ( testconstants "github.com/cosmos/evm/testutil/constants" "github.com/cosmos/evm/testutil/integration/evm/network" utiltx "github.com/cosmos/evm/testutil/tx" + "github.com/cosmos/evm/utils" "cosmossdk.io/math" @@ -27,12 +28,12 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddress() { newWithdrawerAddr := utiltx.GenerateAddress() testCases := []struct { - name string - malleate func() []interface{} - postCheck func() - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func() + gas uint64 + expError bool + wantErr error }{ { "fail - empty input args", @@ -42,7 +43,7 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddress() { func() {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { "fail - invalid delegator address", @@ -55,7 +56,7 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddress() { func() {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidDelegator, ""), + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "fail - invalid withdrawer address", @@ -68,7 +69,7 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddress() { func() {}, 200000, true, - "invalid withdraw address: empty address string is not allowed: invalid address", + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrMsgServerFailed, distribution.SetWithdrawAddressMethod, "invalid withdraw address: empty address string is not allowed: invalid address: invalid address"), }, { "success - using the same address withdrawer address", @@ -85,7 +86,7 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddress() { }, 20000, false, - "", + nil, }, { "success - using a different withdrawer address", @@ -102,7 +103,7 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddress() { }, 20000, false, - "", + nil, }, } @@ -117,7 +118,7 @@ func (s *PrecompileTestSuite) TestSetWithdrawAddress() { _, err := s.precompile.SetWithdrawAddress(ctx, contract, s.network.GetStateDB(), &method, tc.malleate()) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck() @@ -134,12 +135,12 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorReward() { method := s.precompile.Methods[distribution.WithdrawDelegatorRewardMethod] testCases := []struct { - name string - malleate func(val stakingtypes.Validator) []interface{} - postCheck func(data []byte) - gas uint64 - expError bool - errContains string + name string + malleate func(val stakingtypes.Validator) []interface{} + postCheck func(data []byte) + gas uint64 + expError bool + wantErr error }{ { "fail - empty input args", @@ -149,7 +150,7 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorReward() { func([]byte) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { "fail - invalid delegator address", @@ -162,7 +163,7 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorReward() { func([]byte) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidDelegator, ""), + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "fail - invalid validator address", @@ -175,7 +176,7 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorReward() { func([]byte) {}, 200000, true, - "invalid validator address", + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "success - withdraw rewards from a single validator without commission", @@ -206,7 +207,7 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorReward() { }, 20000, false, - "", + nil, }, } @@ -222,7 +223,7 @@ func (s *PrecompileTestSuite) TestWithdrawDelegatorReward() { bz, err := s.precompile.WithdrawDelegatorReward(ctx, contract, s.network.GetStateDB(), &method, args) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck(bz) @@ -236,15 +237,16 @@ func (s *PrecompileTestSuite) TestWithdrawValidatorCommission() { ctx sdk.Context prevBalance sdk.Coin ) - method := s.precompile.Methods[distribution.WithdrawDelegatorRewardMethod] + method := s.precompile.Methods[distribution.WithdrawValidatorCommissionMethod] testCases := []struct { - name string - malleate func(operatorAddress string) []interface{} - postCheck func(data []byte) - gas uint64 - expError bool - errContains string + name string + malleate func(operatorAddress string) []interface{} + postCheck func(data []byte) + gas uint64 + expError bool + wantErr error + wantErrFn func() error }{ { "fail - empty input args", @@ -254,7 +256,8 @@ func (s *PrecompileTestSuite) TestWithdrawValidatorCommission() { func([]byte) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), + nil, }, { "fail - invalid validator address", @@ -266,7 +269,11 @@ func (s *PrecompileTestSuite) TestWithdrawValidatorCommission() { func([]byte) {}, 200000, true, - "empty address string is not allowed", + nil, + func() error { + _, err := utils.HexAddressFromBech32String("") + return cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, fmt.Sprintf("%v", err)) + }, }, { "success - withdraw all commission from a single validator", @@ -305,7 +312,8 @@ func (s *PrecompileTestSuite) TestWithdrawValidatorCommission() { }, 20000, false, - "", + nil, + nil, }, } @@ -326,7 +334,11 @@ func (s *PrecompileTestSuite) TestWithdrawValidatorCommission() { bz, err := s.precompile.WithdrawValidatorCommission(ctx, contract, s.network.GetStateDB(), &method, tc.malleate(s.network.GetValidators()[0].OperatorAddress)) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + wantErr := tc.wantErr + if tc.wantErrFn != nil { + wantErr = tc.wantErrFn() + } + testutil.RequireExactError(s.T(), err, wantErr) } else { s.Require().NoError(err) tc.postCheck(bz) @@ -343,12 +355,12 @@ func (s *PrecompileTestSuite) TestClaimRewards() { method := s.precompile.Methods[distribution.ClaimRewardsMethod] testCases := []struct { - name string - malleate func() []interface{} - postCheck func(data []byte) - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func(data []byte) + gas uint64 + expError bool + wantErr error }{ { "fail - empty input args", @@ -358,7 +370,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { func([]byte) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { "fail - invalid delegator address", @@ -371,7 +383,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { func([]byte) {}, 200000, true, - "invalid delegator address", + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "fail - invalid type for maxRetrieve: expected uint32", @@ -384,7 +396,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { func([]byte) {}, 200000, true, - "invalid type for maxRetrieve: expected uint32", + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, "100000000000000000"), }, { "fail - too many retrieved results", @@ -397,7 +409,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { func([]byte) {}, 200000, true, - "maxRetrieve (32000000) parameter exceeds the maximum number of validators (100)", + cmn.NewRevertWithSolidityError(distribution.ABI, distribution.SolidityErrClaimRewardsMaxRetrieveExceeded, uint32(32_000_000), uint32(100)), }, { "success - withdraw from all validators - 3", @@ -415,7 +427,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { }, 20000, false, - "", + nil, }, { "pass - withdraw from validators with maxRetrieve higher than number of validators", @@ -433,7 +445,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { }, 20000, false, - "", + nil, }, { "success - withdraw from only 1 validator", @@ -449,7 +461,7 @@ func (s *PrecompileTestSuite) TestClaimRewards() { }, 20000, false, - "", + nil, }, } @@ -484,7 +496,8 @@ func (s *PrecompileTestSuite) TestClaimRewards() { bz, err := s.precompile.ClaimRewards(ctx, contract, s.network.GetStateDB(), &method, tc.malleate()) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + s.Require().Error(err) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck(bz) @@ -498,12 +511,12 @@ func (s *PrecompileTestSuite) TestFundCommunityPool() { method := s.precompile.Methods[distribution.FundCommunityPoolMethod] testCases := []struct { - name string - malleate func() []interface{} - postCheck func(data []byte) - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func(data []byte) + gas uint64 + expError bool + wantErr error }{ { "fail - empty input args", @@ -513,7 +526,7 @@ func (s *PrecompileTestSuite) TestFundCommunityPool() { func([]byte) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { "fail - invalid depositor address", @@ -526,7 +539,7 @@ func (s *PrecompileTestSuite) TestFundCommunityPool() { func([]byte) {}, 200000, true, - "invalid hex address address", + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "success - fund the community pool 1 ATOM", @@ -552,7 +565,7 @@ func (s *PrecompileTestSuite) TestFundCommunityPool() { }, 20000, false, - "", + nil, }, } @@ -571,7 +584,8 @@ func (s *PrecompileTestSuite) TestFundCommunityPool() { bz, err := s.precompile.FundCommunityPool(ctx, contract, s.network.GetStateDB(), &method, tc.malleate()) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + s.Require().Error(err) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck(bz) @@ -585,12 +599,12 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolMethod() { method := s.precompile.Methods[distribution.DepositValidatorRewardsPoolMethod] testCases := []struct { - name string - malleate func(val stakingtypes.Validator) []interface{} - postCheck func(data []byte) - gas uint64 - expError bool - errContains string + name string + malleate func(val stakingtypes.Validator) []interface{} + postCheck func(data []byte) + gas uint64 + expError bool + wantErr error }{ { "fail - empty input args", @@ -600,7 +614,7 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolMethod() { func([]byte) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(0)), }, { "fail - invalid depositor address", @@ -619,7 +633,7 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolMethod() { func([]byte) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidHexAddress, "invalidAddress"), + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, "invalidAddress"), }, { "fail - empty validator address", @@ -638,7 +652,7 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolMethod() { func([]byte) {}, 200000, true, - "empty address string is not allowed", + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "fail - invalid amount", @@ -652,7 +666,7 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolMethod() { func([]byte) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidAmount, "invalidAmount"), + cmn.NewRevertWithSolidityError(distribution.ABI, cmn.SolidityErrInvalidAmount, "invalidAmount"), }, { "success - deposit rewards to the validator pool", @@ -709,7 +723,7 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolMethod() { }, 20000, false, - "", + nil, }, } @@ -725,7 +739,7 @@ func (s *PrecompileTestSuite) TestDepositValidatorRewardsPoolMethod() { bz, err := s.precompile.DepositValidatorRewardsPool(ctx, contract, s.network.GetStateDB(), &method, args) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck(bz) diff --git a/tests/integration/precompiles/erc20/test_approve.go b/tests/integration/precompiles/erc20/test_approve.go index a3cbec035..84f6d4c49 100644 --- a/tests/integration/precompiles/erc20/test_approve.go +++ b/tests/integration/precompiles/erc20/test_approve.go @@ -1,12 +1,14 @@ package erc20 import ( + "fmt" "math/big" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" + cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/erc20" "github.com/cosmos/evm/precompiles/testutil" ) @@ -21,12 +23,13 @@ func (s *PrecompileTestSuite) TestApprove() { malleate func() []interface{} postCheck func() expPass bool + wantErr error errContains string }{ { - name: "fail - empty args", - malleate: func() []interface{} { return nil }, - errContains: "invalid number of arguments", + name: "fail - empty args", + malleate: func() []interface{} { return nil }, + wantErr: cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { name: "fail - invalid number of arguments", @@ -35,7 +38,7 @@ func (s *PrecompileTestSuite) TestApprove() { 1, 2, 3, } }, - errContains: "invalid number of arguments", + wantErr: cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(3)), }, { name: "fail - invalid address", @@ -44,7 +47,7 @@ func (s *PrecompileTestSuite) TestApprove() { "invalid address", big.NewInt(2), } }, - errContains: "invalid address", + wantErr: cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "fail - invalid amount", @@ -53,7 +56,7 @@ func (s *PrecompileTestSuite) TestApprove() { s.keyring.GetAddr(1), "invalid amount", } }, - errContains: "invalid amount", + wantErr: cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAmount, "invalid amount"), }, { name: "fail - negative amount", @@ -62,7 +65,7 @@ func (s *PrecompileTestSuite) TestApprove() { s.keyring.GetAddr(1), big.NewInt(-1), } }, - errContains: erc20.ErrNegativeAmount.Error(), + wantErr: cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAmount, "cannot approve negative values"), }, { name: "fail - approve uint256 overflow", @@ -71,7 +74,8 @@ func (s *PrecompileTestSuite) TestApprove() { s.keyring.GetAddr(1), new(big.Int).Add(abi.MaxUint256, common.Big1), } }, - errContains: "causes integer overflow", + wantErr: cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAmount, + fmt.Sprintf(erc20.ErrIntegerOverflow, new(big.Int).Add(abi.MaxUint256, common.Big1))), }, { name: "pass - approve to zero with existing allowance only for other denominations", @@ -241,7 +245,11 @@ func (s *PrecompileTestSuite) TestApprove() { s.Require().NotNil(bz, "expected non-nil bytes") } else { s.Require().Error(err, "expected error") - s.Require().ErrorContains(err, tc.errContains, "expected different error message") + if tc.wantErr != nil { + testutil.RequireExactError(s.T(), err, tc.wantErr) + } else { + s.Require().ErrorContains(err, tc.errContains, "expected different error message") + } s.Require().Empty(bz, "expected empty bytes") } diff --git a/tests/integration/precompiles/erc20/test_integration.go b/tests/integration/precompiles/erc20/test_integration.go index 43073db41..10ab34f41 100644 --- a/tests/integration/precompiles/erc20/test_integration.go +++ b/tests/integration/precompiles/erc20/test_integration.go @@ -16,6 +16,7 @@ import ( . "github.com/onsi/gomega" "github.com/cosmos/evm/contracts" + cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/erc20" "github.com/cosmos/evm/precompiles/erc20/testdata" "github.com/cosmos/evm/precompiles/testutil" @@ -38,6 +39,16 @@ import ( var is *IntegrationTestSuite +// revertReasonExactCheck matches a failed ETH tx whose revert payload is the standard Error(string) encoding of reason. +// Use this instead of WithErrContains / WithErrNested when tests assert revert text: err.Error() often carries only hex. +func revertReasonExactCheck(base testutil.LogCheckArgs, reason string) testutil.LogCheckArgs { + bz, err := evmtypes.RevertReasonBytes(reason) + if err != nil { + panic(err) + } + return base.WithErrExact(evmtypes.NewExecErrorWithReason(bz)) +} + type IntegrationTestSuite struct { suite.Suite @@ -386,11 +397,23 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options // Transfer tokens txArgs, transferArgs := is.getTxAndCallArgs(callType, contractsData, erc20.TransferMethod, receiver, transferAmount) - revertReasonCheck := execRevertedCheck.WithErrNested(erc20.ErrTransferAmountExceedsBalance.Error()) + contractAddr := contractsData.GetContractData(callType).Address + + var revertReasonCheck testutil.LogCheckArgs + switch callType { + case erc20V5CallerCall: + // Caller uses OpenZeppelin ERC20, which reverts with Error(string), not IERC20Errors. + revertReasonCheck = failCheck.WithErrContains("ERC20: transfer amount exceeds balance") + default: + revertReasonCheck = failCheck.WithErrExact(cmn.NewRevertWithSolidityError( + is.precompile.ABI, erc20.SolidityErrERC20InsufficientBalance, contractAddr, common.Big0, transferAmount, + )) + } _, ethRes, err := is.factory.CallContractAndCheckLogs(sender.Priv, txArgs, transferArgs, revertReasonCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes).To(BeNil(), "expected empty result") + // Even on revert, we expect a response with revert bytes. + Expect(ethRes).ToNot(BeNil(), "expected response with revert data") }, // NOTE: we are not passing the direct call here because this test is specific to the contract calls Entry(" - through contract", contractCall), @@ -409,13 +432,13 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options // Transfer tokens txArgs, transferArgs := is.getTxAndCallArgs(callType, contractsData, erc20.TransferMethod, receiver, transferAmt) - insufficientBalanceCheck := failCheck.WithErrContains( - erc20.ErrTransferAmountExceedsBalance.Error(), - ) + insufficientBalanceCheck := failCheck.WithErrExact(cmn.NewRevertWithSolidityError( + is.precompile.ABI, erc20.SolidityErrERC20InsufficientBalance, sender.Addr, senderInitialAmt.BigInt(), transferAmt, + )) _, ethRes, err := is.factory.CallContractAndCheckLogs(sender.Priv, txArgs, transferArgs, insufficientBalanceCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes).To(BeNil(), "expected empty result") + Expect(ethRes).ToNot(BeNil(), "expected response with revert data") }, Entry(" - direct call", directCall), // NOTE: we are not passing the contract call here because this test is for direct calls only @@ -508,7 +531,7 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options } txArgs.Amount = amountToSend - revertReasonCheck := execRevertedCheck.WithErrNested("revert here") + revertReasonCheck := revertReasonExactCheck(execRevertedCheck, "revert here") res, _, err := is.factory.CallContractAndCheckLogs(sender.Priv, txArgs, args, revertReasonCheck) Expect(err).To(BeNil()) @@ -602,7 +625,7 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options } txArgs.Amount = big.NewInt(300) - revertReasonCheck := execRevertedCheck.WithErrNested("revert here") + revertReasonCheck := revertReasonExactCheck(execRevertedCheck, "revert here") res, _, err := is.factory.CallContractAndCheckLogs(sender.Priv, txArgs, args, revertReasonCheck) Expect(err).To(BeNil()) @@ -697,10 +720,14 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options owner.Addr, receiver, transferAmount, ) - transferCheck := passCheck.WithExpEvents( - erc20.EventTypeTransfer, - erc20.EventTypeApproval, - ) + var transferCheck testutil.LogCheckArgs + switch callType { + case erc20Call: + // ERC20MinterBurnerDecimals (OZ in this build) does not emit Approval on transferFrom spend. + transferCheck = passCheck.WithExpEvents(erc20.EventTypeTransfer) + default: + transferCheck = passCheck.WithExpEvents(erc20.EventTypeTransfer, erc20.EventTypeApproval) + } _, ethRes, err := is.factory.CallContractAndCheckLogs(spender.Priv, txArgs, transferArgs, transferCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") @@ -751,13 +778,14 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options owner.Addr, receiver, transferCoins[0].Amount.BigInt(), ) - insufficientAllowanceCheck := failCheck.WithErrContains( - erc20.ErrInsufficientAllowance.Error(), - ) + insufficientAllowanceCheck := failCheck.WithErrExact(cmn.NewRevertWithSolidityError( + is.precompile.ABI, erc20.SolidityErrERC20InsufficientAllowance, + owner.Addr, common.Big0, transferCoins[0].Amount.BigInt(), + )) _, ethRes, err := is.factory.CallContractAndCheckLogs(spender.Priv, txArgs, transferArgs, insufficientAllowanceCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes).To(BeNil(), "expected empty result") + Expect(ethRes).ToNot(BeNil(), "expected response with revert data") // commit changes to chain state err = is.network.NextBlock() @@ -803,10 +831,12 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options owner.Addr, receiver, transferCoins[0].Amount.BigInt(), ) - transferCheck := passCheck.WithExpEvents( - erc20.EventTypeTransfer, - erc20.EventTypeApproval, - ) + var transferCheck testutil.LogCheckArgs + if callType == erc20Call { + transferCheck = passCheck.WithExpEvents(erc20.EventTypeTransfer) + } else { + transferCheck = passCheck.WithExpEvents(erc20.EventTypeTransfer, erc20.EventTypeApproval) + } _, ethRes, err := is.factory.CallContractAndCheckLogs(owner.Priv, txArgs, transferArgs, transferCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") @@ -860,11 +890,14 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options owner.Addr, receiver, transferAmount, ) - insufficientAllowanceCheck := failCheck.WithErrContains(erc20.ErrInsufficientAllowance.Error()) + insufficientAllowanceCheck := failCheck.WithErrExact(cmn.NewRevertWithSolidityError( + is.precompile.ABI, erc20.SolidityErrERC20InsufficientAllowance, + spender.Addr, approveAmount, transferAmount, + )) _, ethRes, err := is.factory.CallContractAndCheckLogs(spender.Priv, txArgs, transferArgs, insufficientAllowanceCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes).To(BeNil(), "expected empty result") + Expect(ethRes).ToNot(BeNil(), "expected response with revert data") }, Entry(" - direct call", directCall), // NOTE: we are not passing the contract call here because this test case only covers direct calls @@ -892,13 +925,14 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options from.Addr, receiver, transferAmount, ) - insufficientAllowanceCheck := failCheck.WithErrContains( - erc20.ErrInsufficientAllowance.Error(), - ) + insufficientAllowanceCheck := failCheck.WithErrExact(cmn.NewRevertWithSolidityError( + is.precompile.ABI, erc20.SolidityErrERC20InsufficientAllowance, + sender.Addr, common.Big0, transferAmount, + )) _, ethRes, err := is.factory.CallContractAndCheckLogs(sender.Priv, txArgs, transferArgs, insufficientAllowanceCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes).To(BeNil(), "expected empty result") + Expect(ethRes).ToNot(BeNil(), "expected response with revert data") // commit changes to chain state err = is.network.NextBlock() @@ -932,13 +966,13 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options // Transfer tokens txArgs, transferArgs := is.getTxAndCallArgs(callType, contractsData, erc20.TransferFromMethod, from.Addr, receiver, transferAmt) - insufficientBalanceCheck := failCheck.WithErrContains( - erc20.ErrTransferAmountExceedsBalance.Error(), - ) + insufficientBalanceCheck := failCheck.WithErrExact(cmn.NewRevertWithSolidityError( + is.precompile.ABI, erc20.SolidityErrERC20InsufficientBalance, from.Addr, senderInitialAmt.BigInt(), transferAmt, + )) _, ethRes, err := is.factory.CallContractAndCheckLogs(sender.Priv, txArgs, transferArgs, insufficientBalanceCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes).To(BeNil(), "expected empty result") + Expect(ethRes).ToNot(BeNil(), "expected response with revert data") // commit changes to chain state err = is.network.NextBlock() @@ -1100,11 +1134,22 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options from.Addr, receiver, transferAmount, ) - revertReasonCheck := execRevertedCheck.WithErrNested(erc20.ErrInsufficientAllowance.Error()) + spenderPrecompileAddr := contractsData.GetContractData(callType).Address + + var revertReasonCheck testutil.LogCheckArgs + switch callType { + case erc20V5CallerCall: + revertReasonCheck = failCheck.WithErrContains("ERC20: insufficient allowance") + default: + revertReasonCheck = failCheck.WithErrExact(cmn.NewRevertWithSolidityError( + is.precompile.ABI, erc20.SolidityErrERC20InsufficientAllowance, + spenderPrecompileAddr, approveAmount, transferAmount, + )) + } _, ethRes, err := is.factory.CallContractAndCheckLogs(from.Priv, txArgs, transferArgs, revertReasonCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes).To(BeNil(), "expected empty result") + Expect(ethRes).ToNot(BeNil(), "expected response with revert data") // commit changes to chain state err = is.network.NextBlock() @@ -1838,7 +1883,7 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options _, ethRes, err := is.factory.CallContractAndCheckLogs(is.keyring.GetPrivKey(0), txArgs, nameArgs, execRevertedCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes).To(BeNil(), "expected empty result") + Expect(ethRes).ToNot(BeNil(), "expected response with revert data") }, Entry(" - direct call", directCall), Entry(" - through contract", contractCall), @@ -1850,7 +1895,7 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options _, ethRes, err := is.factory.CallContractAndCheckLogs(is.keyring.GetPrivKey(0), txArgs, symbolArgs, execRevertedCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes).To(BeNil(), "expected empty result") + Expect(ethRes).ToNot(BeNil(), "expected response with revert data") }, Entry(" - direct call", directCall), Entry(" - through contract", contractCall), @@ -1862,7 +1907,7 @@ func TestIntegrationTestSuite(t *testing.T, create network.CreateEvmApp, options _, ethRes, err := is.factory.CallContractAndCheckLogs(is.keyring.GetPrivKey(0), txArgs, decimalsArgs, execRevertedCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") - Expect(ethRes).To(BeNil(), "expected empty result") + Expect(ethRes).ToNot(BeNil(), "expected response with revert data") }, Entry(" - direct call", directCall), Entry(" - through contract", contractCall), diff --git a/tests/integration/precompiles/erc20/test_query.go b/tests/integration/precompiles/erc20/test_query.go index 17e781356..373cdc5da 100644 --- a/tests/integration/precompiles/erc20/test_query.go +++ b/tests/integration/precompiles/erc20/test_query.go @@ -1,12 +1,13 @@ package erc20 import ( + "fmt" "math" "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/vm" + cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/erc20" "github.com/cosmos/evm/testutil" transferkeeper "github.com/cosmos/ibc-go/v10/modules/apps/transfer/keeper" @@ -110,23 +111,30 @@ func (s *PrecompileTestSuite) TestNameSymbol() { symbolMethod := s.precompile.Methods[erc20.SymbolMethod] testcases := []struct { - name string - denom string - malleate func(sdk.Context, bankkeeper.Keeper, *transferkeeper.Keeper) - expPass bool - errContains string - expName string - expSymbol string + name string + denom string + malleate func(sdk.Context, bankkeeper.Keeper, *transferkeeper.Keeper) + expPass bool + expNameErr error + expSymbolErr error + expName string + expSymbol string }{ { - name: "fail - invalid denom trace", - denom: tooShort.IBCDenom()[:len(tooShort.IBCDenom())-1], - errContains: "odd length hex string", + name: "fail - invalid denom trace", + denom: tooShort.IBCDenom()[:len(tooShort.IBCDenom())-1], + expNameErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.NameMethod, + "encoding/hex: odd length hex string"), + expSymbolErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.SymbolMethod, + "encoding/hex: odd length hex string"), }, { - name: "fail - denom not found", - denom: types.NewDenom("notfound", types.NewHop(types.PortID, "channel-0")).IBCDenom(), - errContains: vm.ErrExecutionReverted.Error(), + name: "fail - denom not found", + denom: types.NewDenom("notfound", types.NewHop(types.PortID, "channel-0")).IBCDenom(), + expNameErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.NameMethod, + "denom not found"), + expSymbolErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.SymbolMethod, + "denom not found"), }, { name: "fail - invalid denom (too short < 3 chars)", @@ -134,12 +142,18 @@ func (s *PrecompileTestSuite) TestNameSymbol() { malleate: func(ctx sdk.Context, _ bankkeeper.Keeper, keeper *transferkeeper.Keeper) { keeper.SetDenom(ctx, tooShort) }, - errContains: vm.ErrExecutionReverted.Error(), + expNameErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.NameMethod, + `invalid base denomination; should be at least length 3; got: "ab"`), + expSymbolErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.SymbolMethod, + `invalid base denomination; should be at least length 3; got: "ab"`), }, { - name: "fail - denom without metadata and not an IBC voucher", - denom: "noIBCvoucher", - errContains: vm.ErrExecutionReverted.Error(), + name: "fail - denom without metadata and not an IBC voucher", + denom: "noIBCvoucher", + expNameErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.NameMethod, + "denom: noIBCvoucher: denom is not an IBC voucher"), + expSymbolErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.SymbolMethod, + "denom: noIBCvoucher: denom is not an IBC voucher"), }, { name: "pass - valid ibc denom without metadata and neither atto nor micro prefix", @@ -199,7 +213,7 @@ func (s *PrecompileTestSuite) TestNameSymbol() { ) // NOTE: all output and error checking happens in here - s.requireOut(bz, err, nameMethod, tc.expPass, tc.errContains, tc.expName) + s.requireOut(bz, err, nameMethod, tc.expPass, tc.expNameErr, tc.expName) }) s.Run("symbol", func() { @@ -212,7 +226,7 @@ func (s *PrecompileTestSuite) TestNameSymbol() { ) // NOTE: all output and error checking happens in here - s.requireOut(bz, err, symbolMethod, tc.expPass, tc.errContains, tc.expSymbol) + s.requireOut(bz, err, symbolMethod, tc.expPass, tc.expSymbolErr, tc.expSymbol) }) }) } @@ -221,36 +235,41 @@ func (s *PrecompileTestSuite) TestNameSymbol() { func (s *PrecompileTestSuite) TestDecimals() { DecimalsMethod := s.precompile.Methods[erc20.DecimalsMethod] + ibcNoMicroAttoDenom := validDenomNoMicroAtto.IBCDenom() testcases := []struct { name string denom string malleate func(sdk.Context, bankkeeper.Keeper, *transferkeeper.Keeper) expPass bool - errContains string + expErr error expDecimals uint8 }{ { - name: "fail - invalid denom trace", - denom: tooShort.IBCDenom()[:len(tooShort.IBCDenom())-1], - errContains: "odd length hex string", + name: "fail - invalid denom trace", + denom: tooShort.IBCDenom()[:len(tooShort.IBCDenom())-1], + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.DecimalsMethod, + "encoding/hex: odd length hex string"), }, { - name: "fail - denom not found", - denom: types.NewDenom("notfound", types.NewHop(types.PortID, "channel-0")).IBCDenom(), - errContains: vm.ErrExecutionReverted.Error(), + name: "fail - denom not found", + denom: types.NewDenom("notfound", types.NewHop(types.PortID, "channel-0")).IBCDenom(), + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.DecimalsMethod, + "denom not found"), }, { - name: "fail - denom without metadata and not an IBC voucher", - denom: "noIBCvoucher", - errContains: vm.ErrExecutionReverted.Error(), + name: "fail - denom without metadata and not an IBC voucher", + denom: "noIBCvoucher", + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.DecimalsMethod, + "denom: noIBCvoucher: denom is not an IBC voucher"), }, { name: "fail - valid ibc denom without metadata and neither atto nor micro prefix", - denom: validDenomNoMicroAtto.IBCDenom(), + denom: ibcNoMicroAttoDenom, malleate: func(ctx sdk.Context, _ bankkeeper.Keeper, keeper *transferkeeper.Keeper) { keeper.SetDenom(ctx, validDenomNoMicroAtto) }, - errContains: vm.ErrExecutionReverted.Error(), + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.DecimalsMethod, + `Should be either micro ('u[...]') or atto ('a[...]'); got: "matom": invalid base denomination`), }, { name: "pass - invalid denom (too short < 3 chars)", @@ -304,7 +323,8 @@ func (s *PrecompileTestSuite) TestDecimals() { // NOTE: we set the denom metadata for the coin keeper.SetDenomMetaData(s.network.GetContext(), overflowMetadata) }, - errContains: vm.ErrExecutionReverted.Error(), + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAmount, + fmt.Sprintf("uint8 overflow: invalid decimals: %d", uint32(math.MaxUint8)+1)), }, { name: "pass - valid ibc denom with metadata but no display denom", @@ -317,7 +337,8 @@ func (s *PrecompileTestSuite) TestDecimals() { // NOTE: we set the denom metadata for the coin keeper.SetDenomMetaData(ctx, noDisplayMetadata) }, - errContains: vm.ErrExecutionReverted.Error(), + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.DecimalsMethod, + fmt.Sprintf("display denomination not found for denom: %q", validMetadataDenom)), }, { name: "pass - valid IBC denom with metadata using display path", @@ -364,8 +385,9 @@ func (s *PrecompileTestSuite) TestDecimals() { Symbol: "MISMATCH", }) }, - expPass: false, - errContains: "execution reverted", + expPass: false, + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrQueryFailed, erc20.DecimalsMethod, + fmt.Sprintf("display denomination not found for denom: %q", "ibc/C1D2E3F4567890123456789012345678901234567890123456789012345678901234")), }, } @@ -389,7 +411,7 @@ func (s *PrecompileTestSuite) TestDecimals() { ) // NOTE: all output and error checking happens in here - s.requireOut(bz, err, DecimalsMethod, tc.expPass, tc.errContains, tc.expDecimals) + s.requireOut(bz, err, DecimalsMethod, tc.expPass, tc.expErr, tc.expDecimals) }) } } @@ -398,11 +420,11 @@ func (s *PrecompileTestSuite) TestTotalSupply() { method := s.precompile.Methods[erc20.TotalSupplyMethod] testcases := []struct { - name string - malleate func(sdk.Context, bankkeeper.Keeper, *big.Int) - expPass bool - errContains string - expTotal *big.Int + name string + malleate func(sdk.Context, bankkeeper.Keeper, *big.Int) + expPass bool + expErr error + expTotal *big.Int }{ { name: "pass - no coins", @@ -441,7 +463,7 @@ func (s *PrecompileTestSuite) TestTotalSupply() { ) // NOTE: all output and error checking happens in here - s.requireOut(bz, err, method, tc.expPass, tc.errContains, tc.expTotal) + s.requireOut(bz, err, method, tc.expPass, tc.expErr, tc.expTotal) }) } } @@ -450,25 +472,25 @@ func (s *PrecompileTestSuite) TestBalanceOf() { method := s.precompile.Methods[erc20.BalanceOfMethod] testcases := []struct { - name string - malleate func(sdk.Context, bankkeeper.Keeper, *big.Int) []interface{} - expPass bool - errContains string - expBalance *big.Int + name string + malleate func(sdk.Context, bankkeeper.Keeper, *big.Int) []interface{} + expPass bool + expErr error + expBalance *big.Int }{ { name: "fail - invalid number of arguments", malleate: func(_ sdk.Context, _ bankkeeper.Keeper, _ *big.Int) []interface{} { return []interface{}{} }, - errContains: "invalid number of arguments; expected 1; got: 0", + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { name: "fail - invalid address", malleate: func(_ sdk.Context, _ bankkeeper.Keeper, _ *big.Int) []interface{} { return []interface{}{"invalid address"} }, - errContains: "invalid account address: invalid address", + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "pass - no coins in token denomination of precompile token pair", @@ -518,7 +540,7 @@ func (s *PrecompileTestSuite) TestBalanceOf() { ) // NOTE: all output and error checking happens in here - s.requireOut(bz, err, method, tc.expPass, tc.errContains, tc.expBalance) + s.requireOut(bz, err, method, tc.expPass, tc.expErr, tc.expBalance) }) } } @@ -527,32 +549,32 @@ func (s *PrecompileTestSuite) TestAllowance() { method := s.precompile.Methods[erc20.AllowanceMethod] testcases := []struct { - name string - malleate func(sdk.Context, *big.Int) []interface{} - expPass bool - errContains string - expAllow *big.Int + name string + malleate func(sdk.Context, *big.Int) []interface{} + expPass bool + expErr error + expAllow *big.Int }{ { name: "fail - invalid number of arguments", malleate: func(_ sdk.Context, _ *big.Int) []interface{} { return []interface{}{1} }, - errContains: "invalid number of arguments; expected 2; got: 1", + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(1)), }, { name: "fail - invalid owner address", malleate: func(_ sdk.Context, _ *big.Int) []interface{} { return []interface{}{"invalid address", s.keyring.GetAddr(1)} }, - errContains: "invalid owner address: invalid address", + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "fail - invalid spender address", malleate: func(_ sdk.Context, _ *big.Int) []interface{} { return []interface{}{s.keyring.GetAddr(0), "invalid address"} }, - errContains: "invalid spender address: invalid address", + expErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "pass - no allowance exists should return 0", @@ -600,7 +622,7 @@ func (s *PrecompileTestSuite) TestAllowance() { ) // NOTE: all output and error checking happens in here - s.requireOut(bz, err, method, tc.expPass, tc.errContains, tc.expAllow) + s.requireOut(bz, err, method, tc.expPass, tc.expErr, tc.expAllow) }) } } diff --git a/tests/integration/precompiles/erc20/test_tx.go b/tests/integration/precompiles/erc20/test_tx.go index d66656798..5fc23b1c6 100644 --- a/tests/integration/precompiles/erc20/test_tx.go +++ b/tests/integration/precompiles/erc20/test_tx.go @@ -3,6 +3,7 @@ package erc20 import ( "math/big" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/holiman/uint256" @@ -32,14 +33,16 @@ var ( func (s *PrecompileTestSuite) TestTransfer() { method := s.precompile.Methods[erc20.TransferMethod] - // fromAddr is the address of the keyring account used for testing. fromAddr := s.keyring.GetKey(0).Addr + negCoinErr := sdk.Coins{{Denom: tokenDenom, Amount: math.NewIntFromBigInt(big.NewInt(-1))}}.Validate() + s.Require().Error(negCoinErr) testcases := []struct { name string malleate func() []interface{} postCheck func() expErr bool errContains string + wantErr error }{ { "fail - negative amount", @@ -48,7 +51,8 @@ func (s *PrecompileTestSuite) TestTransfer() { }, func() {}, true, - "coin -1xmpl amount is not positive", + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAmount, negCoinErr.Error()), }, { "fail - invalid to address", @@ -57,7 +61,8 @@ func (s *PrecompileTestSuite) TestTransfer() { }, func() {}, true, - "invalid to address", + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "fail - invalid amount", @@ -66,7 +71,8 @@ func (s *PrecompileTestSuite) TestTransfer() { }, func() {}, true, - "invalid amount", + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAmount, ""), }, { "fail - not enough balance", @@ -75,7 +81,8 @@ func (s *PrecompileTestSuite) TestTransfer() { }, func() {}, true, - erc20.ErrTransferAmountExceedsBalance.Error(), + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, erc20.SolidityErrERC20InsufficientBalance, fromAddr, big.NewInt(1e18), big.NewInt(2e18)), }, { "fail - not enough balance, sent amount is being vested", @@ -84,7 +91,6 @@ func (s *PrecompileTestSuite) TestTransfer() { accAddr := sdk.AccAddress(fromAddr.Bytes()) err := s.network.App.GetBankKeeper().SendCoins(ctx, s.keyring.GetAccAddr(0), accAddr, sdk.NewCoins(sdk.NewCoin(s.network.GetBaseDenom(), math.NewInt(2e18)))) s.Require().NoError(err) - // replace with vesting account balanceResp, err := s.grpcHandler.GetBalanceFromEVM(accAddr) s.Require().NoError(err) @@ -116,7 +122,8 @@ func (s *PrecompileTestSuite) TestTransfer() { }, func() {}, true, - erc20.ErrTransferAmountExceedsBalance.Error(), + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, erc20.SolidityErrERC20InsufficientBalance, fromAddr, big.NewInt(1e18), big.NewInt(2e18)), }, { "pass", @@ -129,6 +136,7 @@ func (s *PrecompileTestSuite) TestTransfer() { }, false, "", + nil, }, } @@ -137,10 +145,8 @@ func (s *PrecompileTestSuite) TestTransfer() { s.SetupTest() stateDB := s.network.GetStateDB() - var contract *vm.Contract contract, ctx := testutil.NewPrecompileContract(s.T(), s.network.GetContext(), fromAddr, s.precompile.Address(), 0) - // Mint some coins to the module account and then send to the from address err := s.network.App.GetBankKeeper().MintCoins(s.network.GetContext(), erc20types.ModuleName, XMPLCoin) s.Require().NoError(err, "failed to mint coins") err = s.network.App.GetBankKeeper().SendCoinsFromModuleToAccount(s.network.GetContext(), erc20types.ModuleName, fromAddr.Bytes(), XMPLCoin) @@ -149,7 +155,11 @@ func (s *PrecompileTestSuite) TestTransfer() { _, err = s.precompile.Transfer(ctx, contract, stateDB, &method, tc.malleate()) if tc.expErr { s.Require().Error(err, "expected transfer transaction to fail") - s.Require().Contains(err.Error(), tc.errContains, "expected transfer transaction to fail with specific error") + if tc.wantErr != nil { + testutil.RequireExactError(s.T(), err, tc.wantErr) + } else { + s.Require().Contains(err.Error(), tc.errContains, "expected transfer transaction to fail with specific error") + } } else { s.Require().NoError(err, "expected transfer transaction succeeded") tc.postCheck() @@ -164,10 +174,10 @@ func (s *PrecompileTestSuite) TestTransferFrom() { stDB *statedb.StateDB ) method := s.precompile.Methods[erc20.TransferFromMethod] - // owner of the tokens owner := s.keyring.GetKey(0) - // spender of the tokens spender := s.keyring.GetKey(1) + negCoinErr := sdk.Coins{{Denom: tokenDenom, Amount: math.NewIntFromBigInt(big.NewInt(-1))}}.Validate() + s.Require().Error(negCoinErr) testcases := []struct { name string @@ -175,6 +185,7 @@ func (s *PrecompileTestSuite) TestTransferFrom() { postCheck func() expErr bool errContains string + wantErr error }{ { "fail - negative amount", @@ -183,7 +194,8 @@ func (s *PrecompileTestSuite) TestTransferFrom() { }, func() {}, true, - "coin -1xmpl amount is not positive", + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAmount, negCoinErr.Error()), }, { "fail - invalid from address", @@ -192,7 +204,8 @@ func (s *PrecompileTestSuite) TestTransferFrom() { }, func() {}, true, - "invalid from address", + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "fail - invalid to address", @@ -201,7 +214,8 @@ func (s *PrecompileTestSuite) TestTransferFrom() { }, func() {}, true, - "invalid to address", + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "fail - invalid amount", @@ -210,7 +224,8 @@ func (s *PrecompileTestSuite) TestTransferFrom() { }, func() {}, true, - "invalid amount", + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrInvalidAmount, ""), }, { "fail - not enough allowance", @@ -219,7 +234,8 @@ func (s *PrecompileTestSuite) TestTransferFrom() { }, func() {}, true, - erc20.ErrInsufficientAllowance.Error(), + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, erc20.SolidityErrERC20InsufficientAllowance, spender.Addr, common.Big0, big.NewInt(100)), }, { "fail - not enough balance", @@ -231,31 +247,27 @@ func (s *PrecompileTestSuite) TestTransferFrom() { }, func() {}, true, - erc20.ErrTransferAmountExceedsBalance.Error(), + "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, erc20.SolidityErrERC20InsufficientBalance, owner.Addr, big.NewInt(1e18), big.NewInt(2e18)), }, { "fail - spend on behalf of own account without allowance", func() []interface{} { - // Mint some coins to the module account and then send to the spender address err := s.network.App.GetBankKeeper().MintCoins(ctx, erc20types.ModuleName, XMPLCoin) s.Require().NoError(err, "failed to mint coins") err = s.network.App.GetBankKeeper().SendCoinsFromModuleToAccount(ctx, erc20types.ModuleName, spender.AccAddr, XMPLCoin) s.Require().NoError(err, "failed to send coins from module to account") - // NOTE: no allowance is necessary to spend on behalf of the same account return []interface{}{spender.Addr, toAddr, big.NewInt(100)} }, - func() { - toAddrBalance := s.network.App.GetBankKeeper().GetBalance(ctx, toAddr.Bytes(), tokenDenom) - s.Require().Equal(big.NewInt(100), toAddrBalance.Amount.BigInt(), "expected toAddr to have 100 XMPL") - }, + func() {}, true, "", + cmn.NewRevertWithSolidityError(s.precompile.ABI, erc20.SolidityErrERC20InsufficientAllowance, spender.Addr, common.Big0, big.NewInt(100)), }, { "pass - spend on behalf of own account with allowance", func() []interface{} { - // Mint some coins to the module account and then send to the spender address err := s.network.App.GetBankKeeper().MintCoins(ctx, erc20types.ModuleName, XMPLCoin) s.Require().NoError(err, "failed to mint coins") err = s.network.App.GetBankKeeper().SendCoinsFromModuleToAccount(ctx, erc20types.ModuleName, spender.AccAddr, XMPLCoin) @@ -264,7 +276,6 @@ func (s *PrecompileTestSuite) TestTransferFrom() { err = s.network.App.GetErc20Keeper().SetAllowance(ctx, s.precompile.Address(), spender.Addr, spender.Addr, big.NewInt(100)) s.Require().NoError(err, "failed to set allowance") - // NOTE: no allowance is necessary to spend on behalf of the same account return []interface{}{spender.Addr, toAddr, big.NewInt(100)} }, func() { @@ -273,6 +284,7 @@ func (s *PrecompileTestSuite) TestTransferFrom() { }, false, "", + nil, }, { "pass - spend on behalf of other account", @@ -288,6 +300,7 @@ func (s *PrecompileTestSuite) TestTransferFrom() { }, false, "", + nil, }, } @@ -300,7 +313,6 @@ func (s *PrecompileTestSuite) TestTransferFrom() { var contract *vm.Contract contract, ctx = testutil.NewPrecompileContract(s.T(), ctx, spender.Addr, s.precompile.Address(), 0) - // Mint some coins to the module account and then send to the from address err := s.network.App.GetBankKeeper().MintCoins(ctx, erc20types.ModuleName, XMPLCoin) s.Require().NoError(err, "failed to mint coins") err = s.network.App.GetBankKeeper().SendCoinsFromModuleToAccount(ctx, erc20types.ModuleName, owner.AccAddr, XMPLCoin) @@ -309,7 +321,11 @@ func (s *PrecompileTestSuite) TestTransferFrom() { _, err = s.precompile.TransferFrom(ctx, contract, stDB, &method, tc.malleate()) if tc.expErr { s.Require().Error(err, "expected transfer transaction to fail") - s.Require().Contains(err.Error(), tc.errContains, "expected transfer transaction to fail with specific error") + if tc.wantErr != nil { + testutil.RequireExactError(s.T(), err, tc.wantErr) + } else { + s.Require().Contains(err.Error(), tc.errContains, "expected transfer transaction to fail with specific error") + } } else { s.Require().NoError(err, "expected transfer transaction succeeded") tc.postCheck() diff --git a/tests/integration/precompiles/erc20/test_types.go b/tests/integration/precompiles/erc20/test_types.go index 46cbfecd5..245d3409a 100644 --- a/tests/integration/precompiles/erc20/test_types.go +++ b/tests/integration/precompiles/erc20/test_types.go @@ -3,7 +3,9 @@ package erc20 import ( "math/big" + cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/erc20" + "github.com/cosmos/evm/precompiles/testutil" utiltx "github.com/cosmos/evm/testutil/tx" ) @@ -13,10 +15,10 @@ func (s *PrecompileTestSuite) TestParseTransferArgs() { amount := big.NewInt(100) testcases := []struct { - name string - args []interface{} - expPass bool - errContains string + name string + args []interface{} + expPass bool + wantErr error }{ { name: "pass - correct arguments", @@ -32,7 +34,7 @@ func (s *PrecompileTestSuite) TestParseTransferArgs() { "invalid address", amount, }, - errContains: "invalid to address", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "fail - invalid amount", @@ -40,14 +42,14 @@ func (s *PrecompileTestSuite) TestParseTransferArgs() { to, "invalid amount", }, - errContains: "invalid amount", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAmount, "invalid amount"), }, { name: "fail - invalid number of arguments", args: []interface{}{ 1, 2, 3, }, - errContains: "invalid number of arguments", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(3)), }, } @@ -59,8 +61,7 @@ func (s *PrecompileTestSuite) TestParseTransferArgs() { s.Require().Equal(to, tc.args[0], "expected different to address") s.Require().Equal(amount, tc.args[1], "expected different amount") } else { - s.Require().Error(err, "expected an error parsing the transfer arguments") - s.Require().ErrorContains(err, tc.errContains, "expected different error message") + testutil.RequireExactError(s.T(), err, tc.wantErr) } }) } @@ -72,10 +73,10 @@ func (s *PrecompileTestSuite) TestParseTransferFromArgs() { amount := big.NewInt(100) testcases := []struct { - name string - args []interface{} - expPass bool - errContains string + name string + args []interface{} + expPass bool + wantErr error }{ { name: "pass - correct arguments", @@ -93,7 +94,7 @@ func (s *PrecompileTestSuite) TestParseTransferFromArgs() { to, amount, }, - errContains: "invalid from address", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "fail - invalid to address", @@ -102,7 +103,7 @@ func (s *PrecompileTestSuite) TestParseTransferFromArgs() { "invalid address", amount, }, - errContains: "invalid to address", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "fail - invalid amount", @@ -111,14 +112,14 @@ func (s *PrecompileTestSuite) TestParseTransferFromArgs() { to, "invalid amount", }, - errContains: "invalid amount", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAmount, "invalid amount"), }, { name: "fail - invalid number of arguments", args: []interface{}{ 1, 2, 3, 4, }, - errContains: "invalid number of arguments", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(4)), }, } @@ -131,8 +132,7 @@ func (s *PrecompileTestSuite) TestParseTransferFromArgs() { s.Require().Equal(to, tc.args[1], "expected different to address") s.Require().Equal(amount, tc.args[2], "expected different amount") } else { - s.Require().Error(err, "expected an error parsing the transferFrom arguments") - s.Require().ErrorContains(err, tc.errContains, "expected different error message") + testutil.RequireExactError(s.T(), err, tc.wantErr) } }) } @@ -144,10 +144,10 @@ func (s *PrecompileTestSuite) TestParseApproveArgs() { amount := big.NewInt(100) testcases := []struct { - name string - args []interface{} - expPass bool - errContains string + name string + args []interface{} + expPass bool + wantErr error }{ { name: "pass - correct arguments", @@ -163,7 +163,7 @@ func (s *PrecompileTestSuite) TestParseApproveArgs() { "invalid address", amount, }, - errContains: "invalid spender address", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "fail - invalid amount", @@ -171,14 +171,14 @@ func (s *PrecompileTestSuite) TestParseApproveArgs() { spender, "invalid amount", }, - errContains: "invalid amount", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAmount, "invalid amount"), }, { name: "fail - invalid number of arguments", args: []interface{}{ 1, 2, 3, }, - errContains: "invalid number of arguments", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(3)), }, } @@ -190,8 +190,7 @@ func (s *PrecompileTestSuite) TestParseApproveArgs() { s.Require().Equal(spender, tc.args[0], "expected different spender address") s.Require().Equal(amount, tc.args[1], "expected different amount") } else { - s.Require().Error(err, "expected an error parsing the approve arguments") - s.Require().ErrorContains(err, tc.errContains, "expected different error message") + testutil.RequireExactError(s.T(), err, tc.wantErr) } }) } @@ -202,10 +201,10 @@ func (s *PrecompileTestSuite) TestParseAllowanceArgs() { spender := utiltx.GenerateAddress() testcases := []struct { - name string - args []interface{} - expPass bool - errContains string + name string + args []interface{} + expPass bool + wantErr error }{ { name: "pass - correct arguments", @@ -221,7 +220,7 @@ func (s *PrecompileTestSuite) TestParseAllowanceArgs() { "invalid address", spender, }, - errContains: "invalid owner address", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "fail - invalid spender address", @@ -229,14 +228,14 @@ func (s *PrecompileTestSuite) TestParseAllowanceArgs() { owner, "invalid address", }, - errContains: "invalid spender address", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "fail - invalid number of arguments", args: []interface{}{ 1, 2, 3, }, - errContains: "invalid number of arguments", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(3)), }, } @@ -248,8 +247,7 @@ func (s *PrecompileTestSuite) TestParseAllowanceArgs() { s.Require().Equal(owner, tc.args[0], "expected different owner address") s.Require().Equal(spender, tc.args[1], "expected different spender address") } else { - s.Require().Error(err, "expected an error parsing the allowance arguments") - s.Require().ErrorContains(err, tc.errContains, "expected different error message") + testutil.RequireExactError(s.T(), err, tc.wantErr) } }) } @@ -259,10 +257,10 @@ func (s *PrecompileTestSuite) TestParseBalanceOfArgs() { account := utiltx.GenerateAddress() testcases := []struct { - name string - args []interface{} - expPass bool - errContains string + name string + args []interface{} + expPass bool + wantErr error }{ { name: "pass - correct arguments", @@ -276,14 +274,14 @@ func (s *PrecompileTestSuite) TestParseBalanceOfArgs() { args: []interface{}{ "invalid address", }, - errContains: "invalid account address", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidAddress, "invalid address"), }, { name: "fail - invalid number of arguments", args: []interface{}{ 1, 2, 3, }, - errContains: "invalid number of arguments", + wantErr: cmn.NewRevertWithSolidityError(erc20.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(3)), }, } @@ -294,8 +292,7 @@ func (s *PrecompileTestSuite) TestParseBalanceOfArgs() { s.Require().NoError(err, "unexpected error parsing the balanceOf arguments") s.Require().Equal(account, tc.args[0], "expected different account address") } else { - s.Require().Error(err, "expected an error parsing the balanceOf arguments") - s.Require().ErrorContains(err, tc.errContains, "expected different error message") + testutil.RequireExactError(s.T(), err, tc.wantErr) } }) } diff --git a/tests/integration/precompiles/erc20/test_utils.go b/tests/integration/precompiles/erc20/test_utils.go index e68530faa..01bc0c9be 100644 --- a/tests/integration/precompiles/erc20/test_utils.go +++ b/tests/integration/precompiles/erc20/test_utils.go @@ -108,7 +108,7 @@ func (s *PrecompileTestSuite) requireOut( err error, method abi.Method, expPass bool, - errContains string, + expErr error, expValue interface{}, ) { if expPass { @@ -131,7 +131,7 @@ func (s *PrecompileTestSuite) requireOut( } } else { s.Require().Error(err, "expected error") - s.Require().Contains(err.Error(), errContains, "expected different error") + testutil.RequireExactError(s.T(), err, expErr) } } diff --git a/tests/integration/precompiles/gov/test_events.go b/tests/integration/precompiles/gov/test_events.go index 6efc7bf36..ab0c528f2 100644 --- a/tests/integration/precompiles/gov/test_events.go +++ b/tests/integration/precompiles/gov/test_events.go @@ -8,6 +8,7 @@ import ( cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/gov" + precompiletestutil "github.com/cosmos/evm/precompiles/testutil" "github.com/cosmos/evm/x/vm/statedb" storetypes "cosmossdk.io/store/types" @@ -23,12 +24,12 @@ func (s *PrecompileTestSuite) TestVoteEvent() { ) testCases := []struct { - name string - malleate func(voter common.Address, proposalId uint64, option uint8, metadata string) []interface{} - postCheck func() - gas uint64 - expError bool - errContains string + name string + malleate func(voter common.Address, proposalId uint64, option uint8, metadata string) []interface{} + postCheck func() + gas uint64 + expError bool + wantErr error }{ { "success - the correct event is emitted", @@ -59,7 +60,7 @@ func (s *PrecompileTestSuite) TestVoteEvent() { }, 20000, false, - "", + nil, }, } @@ -76,8 +77,7 @@ func (s *PrecompileTestSuite) TestVoteEvent() { _, err := s.precompile.Vote(ctx, contract, stDB, &method, tc.malleate(s.keyring.GetAddr(0), 1, 1, "metadata")) if tc.expError { - s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck() @@ -93,12 +93,12 @@ func (s *PrecompileTestSuite) TestVoteWeightedEvent() { ) testCases := []struct { - name string - malleate func(voter common.Address, proposalId uint64, options gov.WeightedVoteOptions) []interface{} - postCheck func() - gas uint64 - expError bool - errContains string + name string + malleate func(voter common.Address, proposalId uint64, options gov.WeightedVoteOptions) []interface{} + postCheck func() + gas uint64 + expError bool + wantErr error }{ { "success - the correct VoteWeighted event is emitted", @@ -133,7 +133,7 @@ func (s *PrecompileTestSuite) TestVoteWeightedEvent() { }, 20000, false, - "", + nil, }, } @@ -156,8 +156,7 @@ func (s *PrecompileTestSuite) TestVoteWeightedEvent() { _, err := s.precompile.VoteWeighted(ctx, contract, stDB, &method, tc.malleate(s.keyring.GetAddr(0), 1, options)) if tc.expError { - s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck() diff --git a/tests/integration/precompiles/gov/test_gov.go b/tests/integration/precompiles/gov/test_gov.go index b2a2aee96..92be063a6 100644 --- a/tests/integration/precompiles/gov/test_gov.go +++ b/tests/integration/precompiles/gov/test_gov.go @@ -10,6 +10,7 @@ import ( "github.com/holiman/uint256" "github.com/cosmos/evm/precompiles/gov" + precompiletestutil "github.com/cosmos/evm/precompiles/testutil" "github.com/cosmos/evm/testutil" "github.com/cosmos/evm/x/vm/statedb" evmtypes "github.com/cosmos/evm/x/vm/types" @@ -43,11 +44,11 @@ func (s *PrecompileTestSuite) TestIsTransaction() { // TestRun tests the precompile's Run method. func (s *PrecompileTestSuite) TestRun() { testcases := []struct { - name string - malleate func() (common.Address, []byte) - readOnly bool - expPass bool - errContains string + name string + malleate func() (common.Address, []byte) + readOnly bool + expPass bool + wantErr error }{ { name: "pass - vote transaction", @@ -68,6 +69,7 @@ func (s *PrecompileTestSuite) TestRun() { }, readOnly: false, expPass: true, + wantErr: nil, }, } @@ -129,9 +131,8 @@ func (s *PrecompileTestSuite) TestRun() { s.Require().NoError(err, "expected no error when running the precompile") s.Require().NotNil(bz, "expected returned bytes not to be nil") } else { - s.Require().Error(err, "expected error to be returned when running the precompile") s.Require().Nil(bz, "expected returned bytes to be nil") - s.Require().ErrorContains(err, tc.errContains) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErr) } }) } diff --git a/tests/integration/precompiles/gov/test_integration.go b/tests/integration/precompiles/gov/test_integration.go index 33f8a05ee..d4f349644 100644 --- a/tests/integration/precompiles/gov/test_integration.go +++ b/tests/integration/precompiles/gov/test_integration.go @@ -84,7 +84,7 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp ABIEvents: s.precompile.Events, } passCheck = defaultLogCheck.WithExpPass(true) - outOfGasCheck = defaultLogCheck.WithErrContains(vm.ErrOutOfGas.Error()) + outOfGasCheck = defaultLogCheck.WithErrContains("eth tx ran out of gas") // reset tx args each test to avoid keeping custom // values of previous tests (e.g. gasLimit) @@ -139,17 +139,31 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp It("fails with invalid JSON", func() { callArgs.Args = []interface{}{proposerAddr, []byte("{invalid}"), minimalDeposit(s.network.GetBaseDenom(), big.NewInt(1))} - errCheck := defaultLogCheck.WithErrContains("invalid proposal JSON") + errCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + gov.SolidityErrInvalidProposalJSON, + gov.SubmitProposalMethod, + "invalid character 'i' looking for beginning of object key string", + )) _, _, err := s.factory.CallContractAndCheckLogs( proposerKey, txArgs, callArgs, errCheck) Expect(err).To(BeNil()) + + // Matches encoding/json.Unmarshal error for "{invalid}" into NewMsgSubmitProposal's proposal envelope. }) It("fails with invalid deposit denom", func() { jsonBlob := minimalBankSendProposalJSON(proposerAccAddr, s.network.GetBaseDenom(), "1") invalidDep := []cmn.Coin{{Denom: "bad", Amount: big.NewInt(1)}} callArgs.Args = []interface{}{proposerAddr, jsonBlob, invalidDep} - errCheck := defaultLogCheck.WithErrContains("invalid deposit denom") + errCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + gov.SubmitProposalMethod, + "deposited 1bad, but gov accepts only the following denom(s): [aatom]: invalid deposit denom", + )) _, _, err := s.factory.CallContractAndCheckLogs( proposerKey, txArgs, callArgs, errCheck) Expect(err).To(BeNil()) @@ -163,7 +177,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp It("fails with wrong proposal id", func() { callArgs.Args = []interface{}{proposerAddr, uint64(999), minimalDeposit(s.network.GetBaseDenom(), big.NewInt(1))} - errCheck := defaultLogCheck.WithErrContains("not found") + errCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + gov.DepositMethod, + "collections: not found: key '999' of type github.com/cosmos/gogoproto/cosmos.gov.v1.Proposal", + )) _, _, err := s.factory.CallContractAndCheckLogs(proposerKey, txArgs, callArgs, errCheck) Expect(err).To(BeNil()) }) @@ -232,10 +252,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp notProposerKey := s.keyring.GetPrivKey(1) notProposerAddr := s.keyring.GetAddr(1) errCheck := defaultLogCheck.WithErrContains( - cmn.ErrRequesterIsNotMsgSender, - notProposerAddr.String(), - proposerAddr.String(), - ) + vm.ErrExecutionReverted.Error(), + ).WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + notProposerAddr, + proposerAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs(notProposerKey, txArgs, callArgs, errCheck) Expect(err).To(BeNil()) @@ -336,7 +359,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp differentAddr, proposalID, option, metadata, } - voterSetCheck := defaultLogCheck.WithErrContains(cmn.ErrRequesterIsNotMsgSender, s.keyring.GetAddr(0).String(), differentAddr.String()) + voterSetCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(0), + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs(s.keyring.GetPrivKey(0), txArgs, callArgs, voterSetCheck) Expect(err).To(BeNil()) @@ -401,7 +430,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp metadata, } - voterSetCheck := defaultLogCheck.WithErrContains(cmn.ErrRequesterIsNotMsgSender, s.keyring.GetAddr(0).String(), differentAddr.String()) + voterSetCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(0), + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs(s.keyring.GetPrivKey(0), txArgs, callArgs, voterSetCheck) Expect(err).To(BeNil()) @@ -743,7 +778,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp s.keyring.GetPrivKey(0), txArgs, callArgs, - defaultLogCheck.WithErrContains("proposal 999 doesn't exist"), + defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrQueryFailed, + gov.GetProposalMethod, + "rpc error: code = NotFound desc = proposal 999 doesn't exist", + )), ) Expect(err).To(BeNil()) }) diff --git a/tests/integration/precompiles/gov/test_query.go b/tests/integration/precompiles/gov/test_query.go index 3e57f40a9..20b8e8541 100644 --- a/tests/integration/precompiles/gov/test_query.go +++ b/tests/integration/precompiles/gov/test_query.go @@ -1,6 +1,7 @@ package gov import ( + "bytes" "fmt" "math/big" @@ -38,12 +39,12 @@ func (s *PrecompileTestSuite) TestGetVotes() { method := s.precompile.Methods[gov.GetVotesMethod] gas := uint64(200_000) testCases := []struct { - name string - malleate func() []gov.WeightedVote - args []interface{} - expPass bool - errContains string - expTotal uint64 + name string + malleate func() []gov.WeightedVote + args []interface{} + expPass bool + wantErr error + expTotal uint64 }{ { name: "valid query", @@ -80,20 +81,21 @@ func (s *PrecompileTestSuite) TestGetVotes() { expTotal: 1, }, { - name: "invalid proposal ID", - args: []interface{}{uint64(0), query.PageRequest{Limit: 10, CountTotal: true}}, - expPass: false, - errContains: "proposal id can not be 0", + name: "invalid proposal ID", + args: []interface{}{uint64(0), query.PageRequest{Limit: 10, CountTotal: true}}, + expPass: false, + wantErr: cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrQueryFailed, gov.GetVotesMethod, "rpc error: code = InvalidArgument desc = proposal id can not be 0"), }, { - name: "fail - invalid number of args", - args: []interface{}{}, - errContains: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + name: "fail - invalid number of args", + args: []interface{}{}, + expPass: false, + wantErr: cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { - name: "fail - invalid arg types", - args: []interface{}{"string argument 1", 2}, - errContains: "error while unpacking args to VotesInput", + name: "fail - invalid arg types", + args: []interface{}{"string argument 1", 2}, + wantErr: cmn.NewRevertWithSolidityError(gov.ABI, gov.SolidityErrVotesInputUnpackFailed, "abi: cannot unmarshal string in to uint64"), }, { name: "fail - internal error from response", @@ -123,9 +125,9 @@ func (s *PrecompileTestSuite) TestGetVotes() { }, }} }, - args: []interface{}{uint64(1), query.PageRequest{Limit: 10, CountTotal: true}}, - expPass: false, - errContains: "empty address string is not allowed", + args: []interface{}{uint64(1), query.PageRequest{Limit: 10, CountTotal: true}}, + expPass: false, + wantErr: cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrQueryFailed, gov.GetVotesMethod, "failed to convert bech32 string to address: empty address string is not allowed"), }, } @@ -151,8 +153,7 @@ func (s *PrecompileTestSuite) TestGetVotes() { s.Require().Equal(votes, out.Votes) s.Require().Equal(tc.expTotal, out.PageResponse.Total) } else { - s.Require().Error(err) - s.Require().ErrorContains(err, tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } }) } @@ -170,7 +171,7 @@ func (s *PrecompileTestSuite) TestGetVote() { expPass bool expPropNumber uint64 expVoter common.Address - errContains string + wantErrFn func(*PrecompileTestSuite, []interface{}) error }{ { name: "valid query", @@ -183,6 +184,7 @@ func (s *PrecompileTestSuite) TestGetVote() { expPropNumber: uint64(1), expVoter: common.BytesToAddress(voter.Bytes()), expPass: true, + wantErrFn: nil, }, { name: "invalid proposal ID", @@ -191,38 +193,52 @@ func (s *PrecompileTestSuite) TestGetVote() { err := s.network.App.GetGovKeeper().AddVote(s.network.GetContext(), 1, voter, []*govv1.WeightedVoteOption{{Option: govv1.OptionYes, Weight: "1.0"}}, "") s.Require().NoError(err) - return []interface{}{uint64(10), voterAddr} + return []interface{}{uint64(10), common.BytesToAddress(sdk.AccAddress(bytes.Repeat([]byte{0x1}, 20)).Bytes())} + }, + wantErrFn: func(_ *PrecompileTestSuite, args []interface{}) error { + voter := sdk.AccAddress(args[1].(common.Address).Bytes()) + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrQueryFailed, gov.GetVoteMethod, + fmt.Sprintf("rpc error: code = InvalidArgument desc = voter: %s not found for proposal: %d", voter.String(), args[0].(uint64))) }, - errContains: "not found for proposal", }, { name: "non-existent vote", malleate: func() []interface{} { - return []interface{}{uint64(1), voterAddr} + return []interface{}{uint64(1), common.BytesToAddress(sdk.AccAddress(bytes.Repeat([]byte{0x1}, 20)).Bytes())} + }, + expPass: false, + wantErrFn: func(_ *PrecompileTestSuite, args []interface{}) error { + voter := sdk.AccAddress(args[1].(common.Address).Bytes()) + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrQueryFailed, gov.GetVoteMethod, + fmt.Sprintf("rpc error: code = InvalidArgument desc = voter: %s not found for proposal: %d", voter.String(), args[0].(uint64))) }, - expPass: false, - errContains: "not found for proposal", }, { name: "invalid number of args", malleate: func() []interface{} { return []interface{}{} }, - errContains: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + wantErrFn: func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)) + }, }, { name: "fail - invalid proposal id", malleate: func() []interface{} { return []interface{}{"string argument 1", 2} }, - errContains: "invalid proposal id", + wantErrFn: func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, gov.SolidityErrInvalidProposalID, "string argument 1") + }, }, { name: "fail - invalid voter address", malleate: func() []interface{} { return []interface{}{uint64(0), 2} }, - errContains: "invalid voter address", + wantErrFn: func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidAddress, "2") + }, }, } @@ -262,8 +278,7 @@ func (s *PrecompileTestSuite) TestGetVote() { s.Require().Equal(expVote.Options, out.Vote.Options) s.Require().Equal(expVote.Metadata, out.Vote.Metadata) } else { - s.Require().Error(err) - s.Require().ErrorContains(err, tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } }) } @@ -271,6 +286,7 @@ func (s *PrecompileTestSuite) TestGetVote() { func (s *PrecompileTestSuite) TestGetDeposit() { var depositor sdk.AccAddress + method := s.precompile.Methods[gov.GetDepositMethod] testCases := []struct { name string @@ -279,7 +295,7 @@ func (s *PrecompileTestSuite) TestGetDeposit() { expPass bool expPropNumber uint64 gas uint64 - errContains string + wantErrFn func(*PrecompileTestSuite, []interface{}) error }{ { name: "valid query", @@ -288,14 +304,19 @@ func (s *PrecompileTestSuite) TestGetDeposit() { expPropNumber: uint64(1), expPass: true, gas: 200_000, + wantErrFn: nil, }, { - name: "invalid proposal ID", - propNumber: uint64(10), - expPass: false, - gas: 200_000, - malleate: func() {}, - errContains: "not found", + name: "invalid proposal ID", + propNumber: uint64(10), + expPass: false, + gas: 200_000, + malleate: func() {}, + wantErrFn: func(_ *PrecompileTestSuite, args []interface{}) error { + dep := sdk.AccAddress(args[1].(common.Address).Bytes()) + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrQueryFailed, gov.GetDepositMethod, + fmt.Sprintf(`rpc error: code = NotFound desc = collections: not found: key '("10", "%s")' of type github.com/cosmos/gogoproto/cosmos.gov.v1.Deposit`, dep.String())) + }, }, } @@ -322,8 +343,7 @@ func (s *PrecompileTestSuite) TestGetDeposit() { s.Require().Equal(common.BytesToAddress(depositor.Bytes()), out.Deposit.Depositor) s.Require().Equal([]cmn.Coin{{Denom: "aatom", Amount: big.NewInt(100)}}, out.Deposit.Amount) } else { - s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErrFn(s, args)) } }) } @@ -338,6 +358,7 @@ func (s *PrecompileTestSuite) TestGetDeposits() { expPass bool expTotal uint64 gas uint64 + wantErr error }{ { name: "valid query", @@ -359,6 +380,7 @@ func (s *PrecompileTestSuite) TestGetDeposits() { malleate: func() []gov.DepositData { return []gov.DepositData{} }, + wantErr: cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrQueryFailed, gov.GetDepositsMethod, "rpc error: code = InvalidArgument desc = proposal id can not be 0"), }, } @@ -378,7 +400,7 @@ func (s *PrecompileTestSuite) TestGetDeposits() { s.Require().Equal(deposits, out.Deposits) s.Require().Equal(tc.expTotal, out.PageResponse.Total) } else { - s.Require().Error(err) + testutil.RequireExactError(s.T(), err, tc.wantErr) } }) } @@ -387,11 +409,11 @@ func (s *PrecompileTestSuite) TestGetDeposits() { func (s *PrecompileTestSuite) TestGetTallyResult() { method := s.precompile.Methods[gov.GetTallyResultMethod] testCases := []struct { - name string - malleate func() (gov.TallyResultData, uint64) - expPass bool - gas uint64 - errContains string + name string + malleate func() (gov.TallyResultData, uint64) + expPass bool + gas uint64 + wantErr error }{ { name: "valid query", @@ -412,13 +434,14 @@ func (s *PrecompileTestSuite) TestGetTallyResult() { }, expPass: true, gas: 200_000, + wantErr: nil, }, { - name: "invalid proposal ID", - expPass: false, - gas: 200_000, - malleate: func() (gov.TallyResultData, uint64) { return gov.TallyResultData{}, 10 }, - errContains: "proposal 10 doesn't exist", + name: "invalid proposal ID", + expPass: false, + gas: 200_000, + malleate: func() (gov.TallyResultData, uint64) { return gov.TallyResultData{}, 10 }, + wantErr: cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrQueryFailed, gov.GetTallyResultMethod, "rpc error: code = NotFound desc = proposal 10 doesn't exist"), }, } @@ -441,8 +464,7 @@ func (s *PrecompileTestSuite) TestGetTallyResult() { s.Require().NoError(err) s.Require().Equal(expTally, out.TallyResult) } else { - s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } }) } @@ -452,12 +474,12 @@ func (s *PrecompileTestSuite) TestGetProposal() { method := s.precompile.Methods[gov.GetProposalMethod] testCases := []struct { - name string - malleate func() []interface{} - postCheck func(data *gov.ProposalData) - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func(data *gov.ProposalData) + gas uint64 + expError bool + wantErr error }{ { "fail - empty input args", @@ -467,7 +489,7 @@ func (s *PrecompileTestSuite) TestGetProposal() { func(_ *gov.ProposalData) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { "fail - invalid proposal ID", @@ -477,7 +499,7 @@ func (s *PrecompileTestSuite) TestGetProposal() { func(_ *gov.ProposalData) {}, 200000, true, - "proposal id can not be 0", + cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrQueryFailed, gov.GetProposalMethod, "rpc error: code = InvalidArgument desc = proposal id can not be 0"), }, { "fail - proposal doesn't exist", @@ -487,7 +509,7 @@ func (s *PrecompileTestSuite) TestGetProposal() { func(_ *gov.ProposalData) {}, 200000, true, - "proposal 10 doesn't exist", + cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrQueryFailed, gov.GetProposalMethod, "rpc error: code = NotFound desc = proposal 10 doesn't exist"), }, { "success - get proposal", @@ -506,7 +528,7 @@ func (s *PrecompileTestSuite) TestGetProposal() { }, 200000, false, - "", + nil, }, } @@ -519,8 +541,7 @@ func (s *PrecompileTestSuite) TestGetProposal() { bz, err := s.precompile.GetProposal(ctx, &method, contract, tc.malleate()) if tc.expError { - s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) var out gov.ProposalOutput @@ -536,12 +557,12 @@ func (s *PrecompileTestSuite) TestGetProposals() { method := s.precompile.Methods[gov.GetProposalsMethod] testCases := []struct { - name string - malleate func() []interface{} - postCheck func(data []gov.ProposalData, pageRes *query.PageResponse) - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func(data []gov.ProposalData, pageRes *query.PageResponse) + gas uint64 + expError bool + wantErr error }{ { "fail - empty input args", @@ -551,7 +572,7 @@ func (s *PrecompileTestSuite) TestGetProposals() { func(_ []gov.ProposalData, _ *query.PageResponse) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(0)), }, { "success - get all proposals", @@ -582,7 +603,7 @@ func (s *PrecompileTestSuite) TestGetProposals() { }, 200000, false, - "", + nil, }, { "success - filter by status", @@ -605,7 +626,7 @@ func (s *PrecompileTestSuite) TestGetProposals() { }, 200000, false, - "", + nil, }, { "success - filter by voter", @@ -630,7 +651,7 @@ func (s *PrecompileTestSuite) TestGetProposals() { }, 200000, false, - "", + nil, }, { "success - filter by depositor", @@ -651,7 +672,7 @@ func (s *PrecompileTestSuite) TestGetProposals() { }, 200000, false, - "", + nil, }, } @@ -664,8 +685,7 @@ func (s *PrecompileTestSuite) TestGetProposals() { bz, err := s.precompile.GetProposals(ctx, &method, contract, tc.malleate()) if tc.expError { - s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) var out gov.ProposalsOutput @@ -679,10 +699,10 @@ func (s *PrecompileTestSuite) TestGetProposals() { func (s *PrecompileTestSuite) TestGetParams() { testCases := []struct { - name string - malleate func() []interface{} - expPass bool - errContains string + name string + malleate func() []interface{} + expPass bool + wantErr error }{ { "fail - not empty input args", @@ -690,7 +710,7 @@ func (s *PrecompileTestSuite) TestGetParams() { return []interface{}{""} }, false, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 0, 1), + cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(0), big.NewInt(1)), }, { "success - get all params", @@ -698,7 +718,7 @@ func (s *PrecompileTestSuite) TestGetParams() { return []interface{}{} }, true, - "", + nil, }, } @@ -712,8 +732,7 @@ func (s *PrecompileTestSuite) TestGetParams() { if tc.expPass { s.Require().NoError(err) } else { - s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } }) } diff --git a/tests/integration/precompiles/gov/test_tx.go b/tests/integration/precompiles/gov/test_tx.go index 3611b6e6d..0de10bdf9 100644 --- a/tests/integration/precompiles/gov/test_tx.go +++ b/tests/integration/precompiles/gov/test_tx.go @@ -1,7 +1,7 @@ package gov import ( - "fmt" + "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" @@ -25,12 +25,12 @@ func (s *PrecompileTestSuite) TestVote() { const metadata = "metadata" testCases := []struct { - name string - malleate func() []interface{} - postCheck func() - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func() + gas uint64 + expError bool + wantErrFn func(*PrecompileTestSuite, []interface{}) error }{ { "fail - empty input args", @@ -40,7 +40,9 @@ func (s *PrecompileTestSuite) TestVote() { func() {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(0)) + }, }, { "fail - invalid voter address", @@ -55,7 +57,9 @@ func (s *PrecompileTestSuite) TestVote() { func() {}, 200000, true, - "invalid voter address", + func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidAddress, "") + }, }, { "fail - invalid voter address", @@ -70,7 +74,9 @@ func (s *PrecompileTestSuite) TestVote() { func() {}, 200000, true, - "invalid voter address", + func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()) + }, }, { "fail - using a different voter address", @@ -85,7 +91,9 @@ func (s *PrecompileTestSuite) TestVote() { func() {}, 200000, true, - "does not match the requester address", + func(s *PrecompileTestSuite, args []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrRequesterIsNotMsgSender, s.keyring.GetAddr(0), args[0].(common.Address)) + }, }, { "fail - invalid vote option", @@ -100,7 +108,9 @@ func (s *PrecompileTestSuite) TestVote() { func() {}, 200000, true, - "invalid vote option", + func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrMsgServerFailed, gov.VoteMethod, "11: invalid vote option") + }, }, { "success - vote proposal success", @@ -120,7 +130,7 @@ func (s *PrecompileTestSuite) TestVote() { }, 200000, false, - "", + nil, }, } @@ -132,10 +142,11 @@ func (s *PrecompileTestSuite) TestVote() { var contract *vm.Contract contract, ctx = testutil.NewPrecompileContract(s.T(), ctx, s.keyring.GetAddr(0), s.precompile.Address(), tc.gas) - _, err := s.precompile.Vote(ctx, contract, s.network.GetStateDB(), &method, tc.malleate()) + voteArgs := tc.malleate() + _, err := s.precompile.Vote(ctx, contract, s.network.GetStateDB(), &method, voteArgs) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErrFn(s, voteArgs)) } else { s.Require().NoError(err) tc.postCheck() @@ -152,12 +163,12 @@ func (s *PrecompileTestSuite) TestVoteWeighted() { const metadata = "metadata" testCases := []struct { - name string - malleate func() []interface{} - postCheck func() - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func() + gas uint64 + expError bool + wantErrFn func(*PrecompileTestSuite, []interface{}) error }{ { "fail - empty input args", @@ -167,7 +178,9 @@ func (s *PrecompileTestSuite) TestVoteWeighted() { func() {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(0)) + }, }, { "fail - invalid voter address", @@ -182,7 +195,9 @@ func (s *PrecompileTestSuite) TestVoteWeighted() { func() {}, 200000, true, - "invalid voter address", + func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrInvalidAddress, "") + }, }, { "fail - using a different voter address", @@ -197,7 +212,9 @@ func (s *PrecompileTestSuite) TestVoteWeighted() { func() {}, 200000, true, - "does not match the requester address", + func(s *PrecompileTestSuite, args []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrRequesterIsNotMsgSender, s.keyring.GetAddr(0), args[0].(common.Address)) + }, }, { "fail - invalid vote option", @@ -212,7 +229,9 @@ func (s *PrecompileTestSuite) TestVoteWeighted() { func() {}, 200000, true, - "invalid vote option", + func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrMsgServerFailed, gov.VoteWeightedMethod, `option:10 weight:"1.0" : invalid vote option`) + }, }, { "fail - invalid weight sum", @@ -230,7 +249,9 @@ func (s *PrecompileTestSuite) TestVoteWeighted() { func() {}, 200000, true, - "total weight overflow 1.00", + func(*PrecompileTestSuite, []interface{}) error { + return cmn.NewRevertWithSolidityError(gov.ABI, cmn.SolidityErrMsgServerFailed, gov.VoteWeightedMethod, "total weight overflow 1.00: invalid vote option") + }, }, { "success - vote weighted proposal", @@ -254,7 +275,7 @@ func (s *PrecompileTestSuite) TestVoteWeighted() { }, 200000, false, - "", + nil, }, } @@ -266,10 +287,11 @@ func (s *PrecompileTestSuite) TestVoteWeighted() { var contract *vm.Contract contract, ctx = testutil.NewPrecompileContract(s.T(), ctx, s.keyring.GetAddr(0), s.precompile.Address(), tc.gas) - _, err := s.precompile.VoteWeighted(ctx, contract, s.network.GetStateDB(), &method, tc.malleate()) + voteWeightedArgs := tc.malleate() + _, err := s.precompile.VoteWeighted(ctx, contract, s.network.GetStateDB(), &method, voteWeightedArgs) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErrFn(s, voteWeightedArgs)) } else { s.Require().NoError(err) tc.postCheck() diff --git a/tests/integration/precompiles/ics20/test_integration.go b/tests/integration/precompiles/ics20/test_integration.go index 9cc752d70..4d67fc743 100644 --- a/tests/integration/precompiles/ics20/test_integration.go +++ b/tests/integration/precompiles/ics20/test_integration.go @@ -14,7 +14,9 @@ import ( . "github.com/onsi/gomega" "github.com/cosmos/evm" + cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/ics20" + precompiletestutil "github.com/cosmos/evm/precompiles/testutil" "github.com/cosmos/evm/precompiles/testutil/contracts" evmibctesting "github.com/cosmos/evm/testutil/ibc" "github.com/cosmos/evm/testutil/integration/evm/factory" @@ -22,6 +24,7 @@ import ( testutiltypes "github.com/cosmos/evm/testutil/types" evmtypes "github.com/cosmos/evm/x/vm/types" "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" + host "github.com/cosmos/ibc-go/v10/modules/core/24-host" ibctesting "github.com/cosmos/ibc-go/v10/testing" "cosmossdk.io/math" @@ -152,6 +155,7 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, evmAppCreator ibctesting.A 0, ) Expect(err).NotTo(BeNil(), "Failed to testTransfer: %s", err.Error()) + precompiletestutil.RequireExactError(t, err, cmn.NewRevertWithSolidityError(ics20.ABI, cmn.SolidityErrRequesterIsNotMsgSender, ics20CallerAddr, sender)) }) It("should fail if the v1 channel is not found", func() { @@ -188,6 +192,12 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, evmAppCreator ibctesting.A 0, ) Expect(err).NotTo(BeNil(), "Failed to testTransfer: %s", err.Error()) + precompiletestutil.RequireExactError(t, err, cmn.NewRevertWithSolidityError( + ics20.ABI, + cmn.SolidityErrMsgServerFailed, + ics20.TransferMethod, + "port ID (transfer) channel ID (channel-100): channel not found", + )) }) It("should fail if the v2 client id format is invalid", func() { @@ -224,6 +234,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, evmAppCreator ibctesting.A 0, ) Expect(err).NotTo(BeNil(), "Failed to testTransfer: %s", err.Error()) + Expect(host.ClientIdentifierValidator(invalidV2ClientID)).NotTo(BeNil()) + precompiletestutil.RequireExactError(t, err, cmn.NewRevertWithSolidityError( + ics20.ABI, + cmn.SolidityErrMsgServerFailed, + ics20.TransferMethod, + "invalid source channel ID v2: identifier v2 has invalid length: 2, must be between 8-64 characters: invalid identifier", + )) }) It("should successfully call the ICS20 precompile to transfer tokens", func() { diff --git a/tests/integration/precompiles/ics20/test_query.go b/tests/integration/precompiles/ics20/test_query.go index dca6ab452..4182b7483 100644 --- a/tests/integration/precompiles/ics20/test_query.go +++ b/tests/integration/precompiles/ics20/test_query.go @@ -1,7 +1,7 @@ package ics20 import ( - "fmt" + "math/big" "github.com/ethereum/go-ethereum/common" @@ -21,26 +21,30 @@ func (s *PrecompileTestSuite) TestDenoms() { denom := precompiletestutil.UosmoDenom for _, tc := range []struct { - name string - args []interface{} - malleate func(ctx sdk.Context) - expErr bool - errContains string - expDenom transfertypes.Denom + name string + args []interface{} + malleate func(ctx sdk.Context) + expErr bool + wantErr error + expDenom transfertypes.Denom }{ { - name: "fail - invalid number of arguments", - args: []interface{}{}, - malleate: func(ctx sdk.Context) {}, - expErr: true, - errContains: fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + name: "fail - invalid number of arguments", + args: []interface{}{}, + malleate: func(ctx sdk.Context) {}, + expErr: true, + wantErr: cmn.NewRevertWithSolidityError(ics20.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { - name: "fail - invalid arg type", - args: []interface{}{true}, - malleate: func(ctx sdk.Context) {}, - expErr: true, - errContains: "NumField on bool Value", + name: "fail - invalid arg type", + args: []interface{}{true}, + malleate: func(ctx sdk.Context) {}, + expErr: true, + wantErr: cmn.NewRevertWithSolidityError( + ics20.ABI, + cmn.SolidityErrInvalidAddress, + "panic during method.Inputs.Copy: reflect: call of reflect.Value.NumField on bool Value", + ), }, { name: "success", @@ -63,7 +67,8 @@ func (s *PrecompileTestSuite) TestDenoms() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) var out ics20.DenomsResponse @@ -83,26 +88,26 @@ func (s *PrecompileTestSuite) TestDenom() { denom := precompiletestutil.UosmoDenom for _, tc := range []struct { - name string - arg interface{} - malleate func(ctx sdk.Context) - expErr bool - errContains string - expDenom transfertypes.Denom + name string + arg interface{} + malleate func(ctx sdk.Context) + expErr bool + wantErr error + expDenom transfertypes.Denom }{ { - name: "fail - invalid number of arguments", - arg: nil, - malleate: func(ctx sdk.Context) {}, - expErr: true, - errContains: "invalid input arguments", + name: "fail - invalid number of arguments", + arg: nil, + malleate: func(ctx sdk.Context) {}, + expErr: true, + wantErr: cmn.NewRevertWithSolidityError(ics20.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { - name: "fail - invalid type", - arg: 1, - malleate: func(ctx sdk.Context) {}, - expErr: true, - errContains: "invalid hash", + name: "fail - invalid type", + arg: 1, + malleate: func(ctx sdk.Context) {}, + expErr: true, + wantErr: cmn.NewRevertWithSolidityError(ics20.ABI, ics20.SolidityErrInvalidHash, ics20.DenomMethod, "invalid hash: %!s(int=1)"), }, { name: "success - denom found", @@ -121,11 +126,17 @@ func (s *PrecompileTestSuite) TestDenom() { expDenom: transfertypes.Denom{Base: "", Trace: []transfertypes.Hop{}}, }, { - name: "fail - invalid hash", - arg: "INVALID-DENOM-HASH", - malleate: func(ctx sdk.Context) {}, - expErr: true, - errContains: "invalid denom trace hash", + name: "fail - invalid hash", + arg: "INVALID-DENOM-HASH", + malleate: func(ctx sdk.Context) {}, + expErr: true, + // SDK error is stable enough for exact assertion. + wantErr: cmn.NewRevertWithSolidityError( + ics20.ABI, + cmn.SolidityErrQueryFailed, + ics20.DenomMethod, + "rpc error: code = InvalidArgument desc = invalid denom trace hash: , error: encoding/hex: invalid byte: U+0049 'I'", + ), }, } { s.Run(tc.name, func() { @@ -146,7 +157,8 @@ func (s *PrecompileTestSuite) TestDenom() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) var out ics20.DenomResponse @@ -165,26 +177,26 @@ func (s *PrecompileTestSuite) TestDenomHash() { denom := precompiletestutil.UosmoDenom for _, tc := range []struct { - name string - arg interface{} - malleate func(ctx sdk.Context) - expErr bool - errContains string - expHash string + name string + arg interface{} + malleate func(ctx sdk.Context) + expErr bool + wantErr error + expHash string }{ { - name: "fail - invalid number of arguments", - arg: nil, - malleate: func(ctx sdk.Context) {}, - expErr: true, - errContains: "invalid input arguments", + name: "fail - invalid number of arguments", + arg: nil, + malleate: func(ctx sdk.Context) {}, + expErr: true, + wantErr: cmn.NewRevertWithSolidityError(ics20.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { - name: "fail - invalid type", - arg: 1, - malleate: func(ctx sdk.Context) {}, - expErr: true, - errContains: "invalid trace", + name: "fail - invalid type", + arg: 1, + malleate: func(ctx sdk.Context) {}, + expErr: true, + wantErr: cmn.NewRevertWithSolidityError(ics20.ABI, ics20.SolidityErrInvalidTrace, ics20.DenomHashMethod, "invalid trace"), }, { name: "success", @@ -203,11 +215,16 @@ func (s *PrecompileTestSuite) TestDenomHash() { expHash: "", }, { - name: "fail - invalid denom", - arg: "", - malleate: func(ctx sdk.Context) {}, - expErr: true, - errContains: "invalid denomination for cross-chain transfer", + name: "fail - invalid denom", + arg: "", + malleate: func(ctx sdk.Context) {}, + expErr: true, + wantErr: cmn.NewRevertWithSolidityError( + ics20.ABI, + cmn.SolidityErrQueryFailed, + ics20.DenomHashMethod, + "rpc error: code = InvalidArgument desc = base denomination cannot be blank: invalid denomination for cross-chain transfer", + ), }, } { s.Run(tc.name, func() { @@ -228,7 +245,8 @@ func (s *PrecompileTestSuite) TestDenomHash() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + precompiletestutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) var out transfertypes.QueryDenomHashResponse diff --git a/tests/integration/precompiles/ics20/test_tx.go b/tests/integration/precompiles/ics20/test_tx.go index cbd342872..31189fdf9 100644 --- a/tests/integration/precompiles/ics20/test_tx.go +++ b/tests/integration/precompiles/ics20/test_tx.go @@ -5,11 +5,15 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" + "github.com/holiman/uint256" "github.com/cosmos/evm" + cmn "github.com/cosmos/evm/precompiles/common" + "github.com/cosmos/evm/precompiles/ics20" + precompileTestutil "github.com/cosmos/evm/precompiles/testutil" + "github.com/cosmos/evm/testutil" evmibctesting "github.com/cosmos/evm/testutil/ibc" "github.com/cosmos/evm/testutil/tx" - evmtypes "github.com/cosmos/evm/x/vm/types" transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v10/modules/core/02-client/types" @@ -19,13 +23,13 @@ import ( ) type testCase struct { - name string - port string - channelID string - useDynamicChannel bool - overrideSender bool - receiver string - expectErrSubstring string + name string + port string + channelID string + useDynamicChannel bool + overrideSender bool + receiver string + wantErr error } func (s *PrecompileTestSuite) TestTransferErrors() { @@ -37,36 +41,54 @@ func (s *PrecompileTestSuite) TestTransferErrors() { amount := sdkmath.NewInt(1) defaultSender := common.BytesToAddress(s.chainA.SenderAccount.GetAddress().Bytes()) defaultReceiver := s.chainB.SenderAccount.GetAddress().String() + badSender := tx.GenerateAddress() tests := []testCase{ { - name: "invalid source channel", - port: transfertypes.PortID, - channelID: "invalid/channel", - receiver: defaultReceiver, - expectErrSubstring: "invalid source channel ID", + name: "invalid source channel", + port: transfertypes.PortID, + channelID: "invalid/channel", + receiver: defaultReceiver, + wantErr: cmn.NewRevertWithSolidityError( + ics20.ABI, + cmn.SolidityErrMsgServerFailed, + ics20.TransferMethod, + "invalid source channel ID invalid/channel: identifier invalid/channel cannot contain separator '/': invalid identifier", + ), }, { - name: "channel not found", - port: transfertypes.PortID, - channelID: "channel-9", - receiver: defaultReceiver, - expectErrSubstring: "channel not found", + name: "channel not found", + port: transfertypes.PortID, + channelID: "channel-9", + receiver: defaultReceiver, + // Err comes from validateV1TransferChannel -> Wrapf(ErrChannelNotFound, "port ID (...) channel ID (...)") + wantErr: cmn.NewRevertWithSolidityError( + ics20.ABI, + cmn.SolidityErrMsgServerFailed, + ics20.TransferMethod, + "port ID (transfer) channel ID (channel-9): channel not found", + ), }, { - name: "invalid receiver", - port: transfertypes.PortID, - useDynamicChannel: true, - receiver: "", - expectErrSubstring: "invalid address", + name: "invalid receiver", + port: transfertypes.PortID, + useDynamicChannel: true, + receiver: "", + // CreateAndValidateMsgTransfer -> MsgTransfer.ValidateBasic error + wantErr: cmn.NewRevertWithSolidityError( + ics20.ABI, + cmn.SolidityErrMsgServerFailed, + ics20.TransferMethod, + "missing recipient address: invalid address", + ), }, { - name: "msg sender is not a contract caller", - port: transfertypes.PortID, - useDynamicChannel: true, - overrideSender: true, - receiver: defaultReceiver, - expectErrSubstring: "does not match the requester address", + name: "msg sender is not a contract caller", + port: transfertypes.PortID, + useDynamicChannel: true, + overrideSender: true, + receiver: defaultReceiver, + wantErr: cmn.NewRevertWithSolidityError(ics20.ABI, cmn.SolidityErrRequesterIsNotMsgSender, defaultSender, badSender), }, } @@ -84,11 +106,10 @@ func (s *PrecompileTestSuite) TestTransferErrors() { sender := defaultSender if tc.overrideSender { - sender = tx.GenerateAddress() + sender = badSender } - data, err := s.chainAPrecompile.ABI.Pack( - "transfer", + args := []interface{}{ tc.port, channel, denom, @@ -98,20 +119,15 @@ func (s *PrecompileTestSuite) TestTransferErrors() { timeoutHeight, uint64(0), "", - ) - s.Require().NoError(err) - - _, _, res, err := s.chainA.SendEvmTx( - s.chainA.SenderAccounts[0], - 0, - s.chainAPrecompile.Address(), - big.NewInt(0), - data, - 0, - ) - s.Require().Error(err) - s.Require().Contains(err.Error(), vm.ErrExecutionReverted.Error()) - s.Require().Contains(evmtypes.NewExecErrorWithReason(res.Ret).Error(), tc.expectErrSubstring) + } + + ctx := s.chainA.GetContext() + stateDB := testutil.NewStateDB(ctx, evmAppA.GetEVMKeeper()) + method := s.chainAPrecompile.Methods[ics20.TransferMethod] + + contract := vm.NewContract(defaultSender, s.chainAPrecompile.Address(), uint256.NewInt(0), uint64(1_000_000), nil) + _, err = s.chainAPrecompile.Transfer(ctx, contract, stateDB, &method, args) + precompileTestutil.RequireExactError(s.T(), err, tc.wantErr) }) } } diff --git a/tests/integration/precompiles/slashing/test_events.go b/tests/integration/precompiles/slashing/test_events.go index c0a684405..11b20d01a 100644 --- a/tests/integration/precompiles/slashing/test_events.go +++ b/tests/integration/precompiles/slashing/test_events.go @@ -23,12 +23,12 @@ func (s *PrecompileTestSuite) TestUnjailEvent() { ) testCases := []struct { - name string - malleate func() []interface{} - postCheck func() - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func() + gas uint64 + expError bool + wantErr error }{ { "success - the correct event is emitted", @@ -72,7 +72,7 @@ func (s *PrecompileTestSuite) TestUnjailEvent() { }, 20000, false, - "", + nil, }, } @@ -91,7 +91,6 @@ func (s *PrecompileTestSuite) TestUnjailEvent() { if tc.expError { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) } else { s.Require().NoError(err) tc.postCheck() diff --git a/tests/integration/precompiles/slashing/test_integration.go b/tests/integration/precompiles/slashing/test_integration.go index 86c955e2d..6be49ba3f 100644 --- a/tests/integration/precompiles/slashing/test_integration.go +++ b/tests/integration/precompiles/slashing/test_integration.go @@ -127,11 +127,12 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp common.BytesToAddress(valAddr.Bytes()), } - revertReasonCheck := execRevertedCheck.WithErrNested( - cmn.ErrRequesterIsNotMsgSender, + revertReasonCheck := execRevertedCheck.WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, contractAddr, common.BytesToAddress(valAddr.Bytes()), - ) + )) _, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), diff --git a/tests/integration/precompiles/slashing/test_query.go b/tests/integration/precompiles/slashing/test_query.go index afee48897..778e8e6f0 100644 --- a/tests/integration/precompiles/slashing/test_query.go +++ b/tests/integration/precompiles/slashing/test_query.go @@ -1,7 +1,7 @@ package slashing import ( - "fmt" + "math/big" "github.com/ethereum/go-ethereum/common" @@ -22,12 +22,12 @@ func (s *PrecompileTestSuite) TestGetSigningInfo() { consAddr := types.ConsAddress(val0ConsAddr) testCases := []struct { - name string - malleate func() []interface{} - postCheck func(signingInfo *slashing.SigningInfo) - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func(signingInfo *slashing.SigningInfo) + gas uint64 + expError bool + wantErr error }{ { "fail - empty input args", @@ -37,7 +37,7 @@ func (s *PrecompileTestSuite) TestGetSigningInfo() { func(_ *slashing.SigningInfo) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + cmn.NewRevertWithSolidityError(slashing.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { "fail - invalid consensus address", @@ -49,7 +49,7 @@ func (s *PrecompileTestSuite) TestGetSigningInfo() { func(_ *slashing.SigningInfo) {}, 200000, true, - "invalid consensus address", + cmn.NewRevertWithSolidityError(slashing.ABI, cmn.SolidityErrInvalidAddress, common.Address{}.String()), }, { "success - get signing info for validator", @@ -79,7 +79,7 @@ func (s *PrecompileTestSuite) TestGetSigningInfo() { }, 200000, false, - "", + nil, }, } @@ -93,7 +93,7 @@ func (s *PrecompileTestSuite) TestGetSigningInfo() { if tc.expError { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) var out slashing.SigningInfoOutput @@ -109,12 +109,12 @@ func (s *PrecompileTestSuite) TestGetSigningInfos() { method := s.precompile.Methods[slashing.GetSigningInfosMethod] testCases := []struct { - name string - malleate func() []interface{} - postCheck func(signingInfos []slashing.SigningInfo, pageResponse *query.PageResponse) - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func(signingInfos []slashing.SigningInfo, pageResponse *query.PageResponse) + gas uint64 + expError bool + wantErr error }{ { "fail - empty input args", @@ -124,7 +124,7 @@ func (s *PrecompileTestSuite) TestGetSigningInfos() { func(_ []slashing.SigningInfo, _ *query.PageResponse) {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + cmn.NewRevertWithSolidityError(slashing.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { "success - get all signing infos", @@ -167,7 +167,7 @@ func (s *PrecompileTestSuite) TestGetSigningInfos() { }, 200000, false, - "", + nil, }, { "success - get signing infos with pagination", @@ -195,7 +195,7 @@ func (s *PrecompileTestSuite) TestGetSigningInfos() { }, 200000, false, - "", + nil, }, } @@ -209,7 +209,7 @@ func (s *PrecompileTestSuite) TestGetSigningInfos() { if tc.expError { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) var out slashing.SigningInfosOutput @@ -225,12 +225,12 @@ func (s *PrecompileTestSuite) TestGetParams() { method := s.precompile.Methods[slashing.GetParamsMethod] testCases := []struct { - name string - malleate func() []interface{} - postCheck func(params *slashing.Params) - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func(params *slashing.Params) + gas uint64 + expError bool + wantErr error }{ { "success - get params", @@ -249,7 +249,7 @@ func (s *PrecompileTestSuite) TestGetParams() { }, 200000, false, - "", + nil, }, } @@ -263,7 +263,7 @@ func (s *PrecompileTestSuite) TestGetParams() { if tc.expError { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) var out slashing.ParamsOutput diff --git a/tests/integration/precompiles/slashing/test_tx.go b/tests/integration/precompiles/slashing/test_tx.go index c8be3828e..abe8a4f1a 100644 --- a/tests/integration/precompiles/slashing/test_tx.go +++ b/tests/integration/precompiles/slashing/test_tx.go @@ -1,14 +1,13 @@ package slashing import ( - "fmt" + "math/big" "github.com/ethereum/go-ethereum/common" cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/slashing" "github.com/cosmos/evm/precompiles/testutil" - utiltx "github.com/cosmos/evm/testutil/tx" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -16,12 +15,12 @@ import ( func (s *PrecompileTestSuite) TestUnjail() { method := s.precompile.Methods[slashing.UnjailMethod] testCases := []struct { - name string - malleate func() []interface{} - postCheck func() - gas uint64 - expError bool - errContains string + name string + malleate func() []interface{} + postCheck func() + gas uint64 + expError bool + wantErrFn func() error }{ { "fail - empty input args", @@ -31,7 +30,9 @@ func (s *PrecompileTestSuite) TestUnjail() { func() {}, 200000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + func() error { + return cmn.NewRevertWithSolidityError(slashing.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)) + }, }, { "fail - invalid validator address", @@ -43,7 +44,9 @@ func (s *PrecompileTestSuite) TestUnjail() { func() {}, 200000, true, - "invalid validator hex address", + func() error { + return cmn.NewRevertWithSolidityError(slashing.ABI, cmn.SolidityErrInvalidAddress, "") + }, }, { "fail - msg.sender address does not match the validator address (empty address)", @@ -55,19 +58,34 @@ func (s *PrecompileTestSuite) TestUnjail() { func() {}, 200000, true, - "does not match the requester address", + func() error { + return cmn.NewRevertWithSolidityError( + slashing.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(0), + common.Address{}, + ) + }, }, { "fail - msg.sender address does not match the validator address", func() []interface{} { + // any non-caller address is fine; keep deterministic for exact error matching return []interface{}{ - utiltx.GenerateAddress(), + common.HexToAddress("0x0000000000000000000000000000000000000001"), } }, func() {}, 200000, true, - "does not match the requester address", + func() error { + return cmn.NewRevertWithSolidityError( + slashing.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(0), + common.HexToAddress("0x0000000000000000000000000000000000000001"), + ) + }, }, { "fail - validator not jailed", @@ -79,7 +97,14 @@ func (s *PrecompileTestSuite) TestUnjail() { func() {}, 200000, true, - "validator not jailed", + func() error { + return cmn.NewRevertWithSolidityError( + slashing.ABI, + cmn.SolidityErrMsgServerFailed, + slashing.UnjailMethod, + "validator not jailed; cannot be unjailed", + ) + }, }, { "success - validator unjailed", @@ -110,7 +135,7 @@ func (s *PrecompileTestSuite) TestUnjail() { }, 200000, false, - "", + nil, }, } @@ -129,7 +154,9 @@ func (s *PrecompileTestSuite) TestUnjail() { res, err := s.precompile.Unjail(ctx, &method, s.network.GetStateDB(), contract, tc.malleate()) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + s.Require().Error(err) + s.Require().NotNil(tc.wantErrFn) + testutil.RequireExactError(s.T(), err, tc.wantErrFn()) } else { s.Require().NoError(err) s.Require().Equal(cmn.TrueValue, res) diff --git a/tests/integration/precompiles/staking/test_events.go b/tests/integration/precompiles/staking/test_events.go index be5213235..37a07b2f7 100644 --- a/tests/integration/precompiles/staking/test_events.go +++ b/tests/integration/precompiles/staking/test_events.go @@ -10,6 +10,7 @@ import ( cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/staking" + "github.com/cosmos/evm/precompiles/testutil" testkeyring "github.com/cosmos/evm/testutil/keyring" "github.com/cosmos/evm/x/vm/statedb" @@ -28,14 +29,15 @@ func (s *PrecompileTestSuite) TestCreateValidatorEvent() { ) testCases := []struct { - name string - malleate func(delegator common.Address) []interface{} - expErr bool - errContains string - postCheck func(delegator common.Address) + name string + malleate func(delegator common.Address) []interface{} + expErr bool + wantErr error + postCheck func(delegator common.Address) }{ { - name: "success - the correct event is emitted", + name: "success - the correct event is emitted", + wantErr: nil, malleate: func(delegator common.Address) []interface{} { return []interface{}{ staking.Description{ @@ -88,7 +90,8 @@ func (s *PrecompileTestSuite) TestCreateValidatorEvent() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck(delegator.Addr) @@ -107,14 +110,15 @@ func (s *PrecompileTestSuite) TestEditValidatorEvent() { commRate = math.LegacyNewDecWithPrec(5, 2).BigInt() ) testCases := []struct { - name string - malleate func() []interface{} - expErr bool - errContains string - postCheck func() + name string + malleate func() []interface{} + expErr bool + wantErr error + postCheck func() }{ { - name: "success - the correct event is emitted", + name: "success - the correct event is emitted", + wantErr: nil, malleate: func() []interface{} { return []interface{}{ staking.Description{ @@ -165,7 +169,8 @@ func (s *PrecompileTestSuite) TestEditValidatorEvent() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck() @@ -183,24 +188,24 @@ func (s *PrecompileTestSuite) TestDelegateEvent() { method = s.precompile.Methods[staking.DelegateMethod] ) testCases := []struct { - name string - malleate func(delegator common.Address) []interface{} - expErr bool - errContains string - postCheck func(delegator common.Address) + name string + malleate func(delegator common.Address) []interface{} + expErr bool + wantErr error + postCheck func(delegator common.Address) }{ { - "success - the correct event is emitted", - func(delegator common.Address) []interface{} { + name: "success - the correct event is emitted", + wantErr: nil, + malleate: func(delegator common.Address) []interface{} { return []interface{}{ delegator, s.network.GetValidators()[0].OperatorAddress, delegationAmt, } }, - false, - "", - func(delegator common.Address) { + expErr: false, + postCheck: func(delegator common.Address) { log := stDB.Logs()[0] s.Require().Equal(log.Address, s.precompile.Address()) @@ -238,7 +243,8 @@ func (s *PrecompileTestSuite) TestDelegateEvent() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck(delegator.Addr) @@ -255,24 +261,24 @@ func (s *PrecompileTestSuite) TestUnbondEvent() { method := s.precompile.Methods[staking.UndelegateMethod] testCases := []struct { - name string - malleate func(delegator common.Address) []interface{} - expErr bool - errContains string - postCheck func(delegator common.Address) + name string + malleate func(delegator common.Address) []interface{} + expErr bool + wantErr error + postCheck func(delegator common.Address) }{ { - "success - the correct event is emitted", - func(delegator common.Address) []interface{} { + name: "success - the correct event is emitted", + wantErr: nil, + malleate: func(delegator common.Address) []interface{} { return []interface{}{ delegator, s.network.GetValidators()[0].OperatorAddress, big.NewInt(1000000000000000000), } }, - false, - "", - func(delegator common.Address) { + expErr: false, + postCheck: func(delegator common.Address) { log := stDB.Logs()[0] // Check event signature matches the one emitted event := s.precompile.Events[staking.EventTypeUnbond] @@ -307,7 +313,8 @@ func (s *PrecompileTestSuite) TestUnbondEvent() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) tc.postCheck(delegator.Addr) @@ -324,15 +331,16 @@ func (s *PrecompileTestSuite) TestRedelegateEvent() { method := s.precompile.Methods[staking.RedelegateMethod] testCases := []struct { - name string - malleate func(delegator common.Address) []interface{} - expErr bool - errContains string - postCheck func(delegator common.Address) + name string + malleate func(delegator common.Address) []interface{} + expErr bool + wantErr error + postCheck func(delegator common.Address) }{ { - "success - the correct event is emitted", - func(delegator common.Address) []interface{} { + name: "success - the correct event is emitted", + wantErr: nil, + malleate: func(delegator common.Address) []interface{} { return []interface{}{ delegator, s.network.GetValidators()[0].OperatorAddress, @@ -340,9 +348,8 @@ func (s *PrecompileTestSuite) TestRedelegateEvent() { big.NewInt(1000000000000000000), } }, - false, - "", - func(delegator common.Address) { + expErr: false, + postCheck: func(delegator common.Address) { log := stDB.Logs()[0] // Check event signature matches the one emitted event := s.precompile.Events[staking.EventTypeRedelegate] @@ -378,12 +385,13 @@ func (s *PrecompileTestSuite) TestRedelegateEvent() { contract := vm.NewContract(delegator.Addr, s.precompile.Address(), common.U2560, 20000, nil) _, err := s.precompile.Redelegate(ctx, contract, stDB, &method, tc.malleate(delegator.Addr)) - s.Require().NoError(err) if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { + s.Require().NoError(err) tc.postCheck(delegator.Addr) } }) @@ -399,15 +407,16 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegationEvent() { methodUndelegate := s.precompile.Methods[staking.UndelegateMethod] testCases := []struct { - name string - malleate func(contract *vm.Contract, delegator testkeyring.Key) []interface{} - expErr bool - errContains string - postCheck func(delegator common.Address) + name string + malleate func(contract *vm.Contract, delegator testkeyring.Key) []interface{} + expErr bool + wantErr error + postCheck func(delegator common.Address) }{ { - "success - the correct event is emitted", - func(contract *vm.Contract, delegator testkeyring.Key) []interface{} { + name: "success - the correct event is emitted", + wantErr: nil, + malleate: func(contract *vm.Contract, delegator testkeyring.Key) []interface{} { undelegateArgs := []interface{}{ delegator.Addr, s.network.GetValidators()[0].OperatorAddress, @@ -423,9 +432,8 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegationEvent() { big.NewInt(1), } }, - false, - "", - func(delegator common.Address) { + expErr: false, + postCheck: func(delegator common.Address) { log := stDB.Logs()[1] // Check event signature matches the one emitted @@ -460,12 +468,12 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegationEvent() { contract := vm.NewContract(delegator.Addr, s.precompile.Address(), uint256.NewInt(0), 20000, nil) callArgs := tc.malleate(contract, delegator) _, err := s.precompile.CancelUnbondingDelegation(ctx, contract, stDB, &methodCancelUnbonding, callArgs) - s.Require().NoError(err) - if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { + s.Require().NoError(err) tc.postCheck(delegator.Addr) } }) diff --git a/tests/integration/precompiles/staking/test_integration.go b/tests/integration/precompiles/staking/test_integration.go index f31fe33b2..d944e0fed 100644 --- a/tests/integration/precompiles/staking/test_integration.go +++ b/tests/integration/precompiles/staking/test_integration.go @@ -7,7 +7,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" - "google.golang.org/grpc/codes" //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/ginkgo/v2" @@ -35,6 +34,7 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/query" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -82,7 +82,7 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp defaultLogCheck = testutil.LogCheckArgs{ABIEvents: s.precompile.Events} passCheck = defaultLogCheck.WithExpPass(true) - outOfGasCheck = defaultLogCheck.WithErrContains(vm.ErrOutOfGas.Error()) + outOfGasCheck = defaultLogCheck.WithErrContains("eth tx ran out of gas") }) Describe("when the precompile is not enabled in the EVM params", func() { @@ -218,9 +218,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp defaultDescription, defaultCommission, defaultMinSelfDelegation, differentAddr, defaultPubkeyBase64Str, defaultValue, } - logCheckArgs := defaultLogCheck.WithErrContains( - fmt.Sprintf(cmn.ErrRequesterIsNotMsgSender, s.keyring.GetAddr(0), differentAddr), - ) + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(0), + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), @@ -331,14 +335,19 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp defaultDescription, valHexAddr, defaultCommissionRate, defaultMinSelfDelegation, } - logCheckArgs := passCheck.WithExpEvents(staking.EventTypeEditValidator) + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + s.keyring.GetAddr(1), + valHexAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(1), txArgs, callArgs, logCheckArgs, ) - Expect(err).NotTo(BeNil(), "error while calling the contract and checking logs") - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("msg.sender address %s does not match the requester address %s", s.keyring.GetAddr(1), valHexAddr))) + Expect(err).To(BeNil(), "error while calling the contract and checking logs") }) }) }) @@ -396,7 +405,17 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp common.BytesToAddress(newAddr), valAddr.String(), big.NewInt(1e18), } - logCheckArgs := defaultLogCheck.WithErrContains("insufficient funds") + ctx := s.network.GetContext() + bal := s.network.App.GetBankKeeper().GetBalance(ctx, newAddr, s.bondDenom) + wantCoin := sdk.NewCoin(s.bondDenom, math.NewInt(1e18)) + wantMsg := fmt.Sprintf("failed to delegate; %s is smaller than %s: insufficient funds", bal, wantCoin) + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + staking.DelegateMethod, + wantMsg, + )) _, _, err = s.factory.CallContractAndCheckLogs( newAddrPriv, @@ -416,7 +435,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp delegator.Addr, nonExistingValAddr.String(), big.NewInt(2e18), } - logCheckArgs := defaultLogCheck.WithErrContains("validator does not exist") + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + staking.DelegateMethod, + stakingtypes.ErrNoValidatorFound.Error(), + )) _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -437,9 +462,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp differentAddr, valAddr.String(), big.NewInt(2e18), } - logCheckArgs := defaultLogCheck.WithErrContains( - fmt.Sprintf(cmn.ErrRequesterIsNotMsgSender, delegator.Addr, differentAddr), - ) + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + delegator.Addr, + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -494,7 +523,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp delegator.Addr, valAddr.String(), big.NewInt(2e18), } - logCheckArgs := defaultLogCheck.WithErrContains("invalid shares amount") + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + staking.UndelegateMethod, + "invalid shares amount: invalid request", + )) _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -513,7 +548,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp delegator.Addr, nonExistingValAddr.String(), big.NewInt(1e18), } - logCheckArgs := defaultLogCheck.WithErrContains("validator does not exist") + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + staking.UndelegateMethod, + stakingtypes.ErrNoValidatorFound.Error(), + )) _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -532,9 +573,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp differentAddr, valAddr.String(), big.NewInt(1e18), } - logCheckArgs := defaultLogCheck.WithErrContains( - fmt.Sprintf(cmn.ErrRequesterIsNotMsgSender, delegator.Addr, differentAddr), - ) + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + delegator.Addr, + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -586,7 +631,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp delegator.Addr, valAddr.String(), valAddr2.String(), big.NewInt(2e18), } - logCheckArgs := defaultLogCheck.WithErrContains("invalid shares amount") + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + staking.RedelegateMethod, + "invalid shares amount: invalid request", + )) _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -605,7 +656,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp delegator.Addr, valAddr.String(), nonExistingValAddr.String(), big.NewInt(1e18), } - logCheckArgs := defaultLogCheck.WithErrContains("redelegation destination validator not found") + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + staking.RedelegateMethod, + stakingtypes.ErrBadRedelegationDst.Error(), + )) _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -625,9 +682,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp differentAddr, valAddr.String(), valAddr2.String(), big.NewInt(1e18), } - logCheckArgs := defaultLogCheck.WithErrContains( - fmt.Sprintf(cmn.ErrRequesterIsNotMsgSender, delegator.Addr, differentAddr), - ) + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrRequesterIsNotMsgSender, + delegator.Addr, + differentAddr, + )) _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -722,7 +783,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp delegator.Addr, valAddr.String(), big.NewInt(2e18), big.NewInt(creationHeight), } - logCheckArgs := defaultLogCheck.WithErrContains("amount is greater than the unbonding delegation entry balance") + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + staking.CancelUnbondingDelegationMethod, + "amount is greater than the unbonding delegation entry balance: invalid request", + )) _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -745,7 +812,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp delegator.Addr, valAddr.String(), big.NewInt(1e18), big.NewInt(creationHeight + 1), } - logCheckArgs := defaultLogCheck.WithErrContains("unbonding delegation entry is not found at block height") + logCheckArgs := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + staking.CancelUnbondingDelegationMethod, + fmt.Sprintf("unbonding delegation entry is not found at block height %d: not found", creationHeight+1), + )) _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -882,12 +955,26 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp It("should return an error if the bonding type is not known", func() { delegator := s.keyring.GetKey(0) - callArgs.Args = []interface{}{ + args := []interface{}{ "15", // invalid bonding type query.PageRequest{}, } + method := s.precompile.Methods[staking.ValidatorsMethod] + req, rerr := staking.NewValidatorsRequest(&method, args) + Expect(rerr).To(BeNil()) + q := stakingkeeper.NewQuerier(s.network.App.GetStakingKeeper()) + _, qerr := q.Validators(s.network.GetContext(), req) + Expect(qerr).To(HaveOccurred()) - invalidStatusCheck := defaultLogCheck.WithErrContains("invalid validator status 15") + invalidStatusCheck := defaultLogCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrQueryFailed, + staking.ValidatorsMethod, + qerr.Error(), + )) + + callArgs.Args = args _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -2126,11 +2213,15 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp txArgs.To = &contractTwoAddr - reverReasonCheck := execRevertedCheck.WithErrContains( - errorsmod.Wrapf( - sdkerrors.ErrUnauthorized, "%s is not allowed to receive funds", bondedTokensPoolAccAddr.String(), - ).Error(), - ) + // Bank/module-account guard wraps the SDK error with "failed to set account: ". + // Substring checks against err.Error() miss this because DecodeRevertReason surfaces hex in the message. + revertBz, encErr := evmtypes.RevertReasonBytes("failed to set account: " + errorsmod.Wrapf( + sdkerrors.ErrUnauthorized, + "%s is not allowed to receive funds", + bondedTokensPoolAccAddr.String(), + ).Error()) + Expect(encErr).To(BeNil()) + reverReasonCheck := execRevertedCheck.WithErrExact(evmtypes.NewExecErrorWithReason(revertBz)) _, _, err := s.factory.CallContractAndCheckLogs( s.keyring.GetPrivKey(0), @@ -2164,9 +2255,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp nonExistingVal.String(), } - reverReasonCheck := execRevertedCheck.WithErrContains( - stakingtypes.ErrNoValidatorFound.Error(), - ) + reverReasonCheck := execRevertedCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + staking.DelegateMethod, + stakingtypes.ErrNoValidatorFound.Error(), + )) _, _, err = s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -2249,7 +2344,10 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp nonExistingVal.String(), big.NewInt(1e18), } - revertReasonCheck := execRevertedCheck.WithErrNested(CallerErrDelegationNotExist) + // Precompile surfaces the msg server error as a standard Error(string) revert (0x08c379a0…), not IPrecompile MsgServerFailed. + revertBz, encErr := evmtypes.RevertReasonBytes(CallerErrDelegationNotExist) + Expect(encErr).To(BeNil()) + revertReasonCheck := execRevertedCheck.WithErrExact(evmtypes.NewExecErrorWithReason(revertBz)) _, _, err = s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -2271,7 +2369,10 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp valAddr.String(), big.NewInt(1e18), } - revertReasonCheck := execRevertedCheck.WithErrNested(CallerErrDelegationNotExist) + // Same as "delegation does not exist": StakingCaller._checkDelegation runs before the precompile. + revertBz, encErr := evmtypes.RevertReasonBytes(CallerErrDelegationNotExist) + Expect(encErr).To(BeNil()) + revertReasonCheck := execRevertedCheck.WithErrExact(evmtypes.NewExecErrorWithReason(revertBz)) _, _, err := s.factory.CallContractAndCheckLogs( differentSender.Priv, @@ -2353,7 +2454,9 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp nonExistingVal.String(), valAddr2.String(), big.NewInt(1e18), } - revertReasonCheck := execRevertedCheck.WithErrNested(CallerErrDelegationNotExist) + revertBz, encErr := evmtypes.RevertReasonBytes(CallerErrDelegationNotExist) + Expect(encErr).To(BeNil()) + revertReasonCheck := execRevertedCheck.WithErrExact(evmtypes.NewExecErrorWithReason(revertBz)) _, _, err = s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -2375,7 +2478,9 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp valAddr.String(), valAddr2.String(), big.NewInt(1e18), } - revertReasonCheck := execRevertedCheck.WithErrNested(CallerErrDelegationNotExist) + revertBz, encErr := evmtypes.RevertReasonBytes(CallerErrDelegationNotExist) + Expect(encErr).To(BeNil()) + revertReasonCheck := execRevertedCheck.WithErrExact(evmtypes.NewExecErrorWithReason(revertBz)) _, _, err = s.factory.CallContractAndCheckLogs( differentSender.Priv, @@ -2397,9 +2502,15 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp valAddr.String(), nonExistingVal.String(), big.NewInt(1e18), } - revertReasonCheck := execRevertedCheck.WithErrNested(stakingtypes.ErrBadRedelegationDst.Error()) + revertReasonCheck := execRevertedCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrMsgServerFailed, + staking.RedelegateMethod, + stakingtypes.ErrBadRedelegationDst.Error(), + )) - _, _, err = s.factory.CallContractAndCheckLogs( + _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, txArgs, callArgs, revertReasonCheck, @@ -2510,7 +2621,9 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp big.NewInt(expCreationHeight), } - revertReasonCheck := execRevertedCheck.WithErrNested(CallerErrUnbondingDelegationNotExist) + revertBz, encErr := evmtypes.RevertReasonBytes(CallerErrUnbondingDelegationNotExist) + Expect(encErr).To(BeNil()) + revertReasonCheck := execRevertedCheck.WithErrExact(evmtypes.NewExecErrorWithReason(revertBz)) _, _, err = s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -2669,14 +2782,26 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp It("should revert the execution if the bonding type is not known", func() { delegator := s.keyring.GetKey(0) - callArgs.Args = []interface{}{ + args := []interface{}{ "15", // invalid bonding type query.PageRequest{}, } + method := s.precompile.Methods[staking.ValidatorsMethod] + req, rerr := staking.NewValidatorsRequest(&method, args) + Expect(rerr).To(BeNil()) + q := stakingkeeper.NewQuerier(s.network.App.GetStakingKeeper()) + _, qerr := q.Validators(s.network.GetContext(), req) + Expect(qerr).To(HaveOccurred()) - revertReasonCheck := execRevertedCheck.WithErrNested( - fmt.Sprintf("rpc error: code = %s desc = invalid validator status %s", codes.InvalidArgument, "15"), - ) + revertReasonCheck := execRevertedCheck.WithErrContains(vm.ErrExecutionReverted.Error()). + WithErrExact(cmn.NewRevertWithSolidityError( + s.precompile.ABI, + cmn.SolidityErrQueryFailed, + staking.ValidatorsMethod, + qerr.Error(), + )) + + callArgs.Args = args _, _, err := s.factory.CallContractAndCheckLogs( delegator.Priv, @@ -3089,9 +3214,13 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp valAddr2.String(), big.NewInt(1e18), testcase.calltype, } - checkArgs := execRevertedCheck.WithErrNested(fmt.Sprintf("failed %s to precompile", testcase.calltype)) + var checkArgs testutil.LogCheckArgs if testcase.expTxPass { checkArgs = passCheck.WithExpEvents(staking.EventTypeUnbond) + } else { + revertBz, encErr := evmtypes.RevertReasonBytes(fmt.Sprintf("failed %s to precompile", testcase.calltype)) + Expect(encErr).To(BeNil()) + checkArgs = execRevertedCheck.WithErrExact(evmtypes.NewExecErrorWithReason(revertBz)) } _, _, err := s.factory.CallContractAndCheckLogs( diff --git a/tests/integration/precompiles/staking/test_query.go b/tests/integration/precompiles/staking/test_query.go index 46f94212b..9faac9ef9 100644 --- a/tests/integration/precompiles/staking/test_query.go +++ b/tests/integration/precompiles/staking/test_query.go @@ -1,21 +1,24 @@ package staking import ( - "fmt" "math/big" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/holiman/uint256" + evmaddress "github.com/cosmos/evm/encoding/address" cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/staking" + "github.com/cosmos/evm/precompiles/testutil" testutiltx "github.com/cosmos/evm/testutil/tx" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -23,12 +26,12 @@ func (s *PrecompileTestSuite) TestDelegation() { method := s.precompile.Methods[staking.DelegationMethod] testCases := []struct { - name string - malleate func(operatorAddress string) []interface{} - postCheck func(bz []byte) - gas uint64 - expErr bool - errContains string + name string + malleate func(operatorAddress string) []interface{} + postCheck func(bz []byte) + gas uint64 + expErr bool + wantErr error }{ { "fail - empty input args", @@ -38,7 +41,7 @@ func (s *PrecompileTestSuite) TestDelegation() { func([]byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { "fail - invalid delegator address", @@ -51,7 +54,7 @@ func (s *PrecompileTestSuite) TestDelegation() { func([]byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "invalid"), }, { "fail - invalid operator address", @@ -64,7 +67,7 @@ func (s *PrecompileTestSuite) TestDelegation() { func([]byte) {}, 100000, true, - "invalid: unknown address", + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "invalid"), }, { "success - empty delegation", @@ -83,7 +86,7 @@ func (s *PrecompileTestSuite) TestDelegation() { }, 100000, false, - "", + nil, }, { "success", @@ -101,7 +104,7 @@ func (s *PrecompileTestSuite) TestDelegation() { }, 100000, false, - "", + nil, }, } @@ -114,7 +117,8 @@ func (s *PrecompileTestSuite) TestDelegation() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) s.Require().NotEmpty(bz) @@ -128,12 +132,12 @@ func (s *PrecompileTestSuite) TestUnbondingDelegation() { method := s.precompile.Methods[staking.UnbondingDelegationMethod] testCases := []struct { - name string - malleate func(operatorAddress string) []interface{} - postCheck func(bz []byte) - gas uint64 - expErr bool - errContains string + name string + malleate func(operatorAddress string) []interface{} + postCheck func(bz []byte) + gas uint64 + expErr bool + wantErr error }{ { "fail - empty input args", @@ -143,7 +147,7 @@ func (s *PrecompileTestSuite) TestUnbondingDelegation() { func([]byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { "fail - invalid delegator address", @@ -156,7 +160,7 @@ func (s *PrecompileTestSuite) TestUnbondingDelegation() { func([]byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "invalid"), }, { "success - no unbonding delegation found", @@ -175,7 +179,7 @@ func (s *PrecompileTestSuite) TestUnbondingDelegation() { }, 100000, false, - "", + nil, }, { "success", @@ -195,7 +199,7 @@ func (s *PrecompileTestSuite) TestUnbondingDelegation() { }, 100000, false, - "", + nil, }, } @@ -213,7 +217,8 @@ func (s *PrecompileTestSuite) TestUnbondingDelegation() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) s.Require().NotNil(bz) @@ -227,12 +232,12 @@ func (s *PrecompileTestSuite) TestValidator() { method := s.precompile.Methods[staking.ValidatorMethod] testCases := []struct { - name string - malleate func(operatorAddress common.Address) []interface{} - postCheck func(bz []byte) - gas uint64 - expErr bool - errContains string + name string + malleate func(operatorAddress common.Address) []interface{} + postCheck func(bz []byte) + gas uint64 + expErr bool + wantErr error }{ { "fail - empty input args", @@ -242,7 +247,7 @@ func (s *PrecompileTestSuite) TestValidator() { func(_ []byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 1, 0), + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(1), big.NewInt(0)), }, { "success", @@ -263,7 +268,7 @@ func (s *PrecompileTestSuite) TestValidator() { }, 100000, false, - "", + nil, }, { name: "success - empty validator", @@ -297,7 +302,8 @@ func (s *PrecompileTestSuite) TestValidator() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) s.Require().NotNil(bz) @@ -311,12 +317,12 @@ func (s *PrecompileTestSuite) TestValidators() { method := s.precompile.Methods[staking.ValidatorsMethod] testCases := []struct { - name string - malleate func() []interface{} - postCheck func(bz []byte) - gas uint64 - expErr bool - errContains string + name string + malleate func() []interface{} + postCheck func(bz []byte) + gas uint64 + expErr bool + wantErr error }{ { "fail - empty input args", @@ -326,7 +332,7 @@ func (s *PrecompileTestSuite) TestValidators() { func(_ []byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 0), + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(0)), }, { "fail - invalid number of arguments", @@ -338,7 +344,7 @@ func (s *PrecompileTestSuite) TestValidators() { func(_ []byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 2, 1), + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(2), big.NewInt(1)), }, { "success - bonded status & pagination w/countTotal", @@ -365,7 +371,7 @@ func (s *PrecompileTestSuite) TestValidators() { }, 100000, false, - "", + nil, }, { "success - bonded status & pagination w/countTotal & key is []byte{0}", @@ -393,7 +399,7 @@ func (s *PrecompileTestSuite) TestValidators() { }, 100000, false, - "", + nil, }, } @@ -406,7 +412,8 @@ func (s *PrecompileTestSuite) TestValidators() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) s.Require().NotNil(bz) @@ -421,12 +428,12 @@ func (s *PrecompileTestSuite) TestRedelegation() { redelegateMethod := s.precompile.Methods[staking.RedelegateMethod] testCases := []struct { - name string - malleate func(srcOperatorAddr, destOperatorAddr string) []interface{} - postCheck func(bz []byte) - gas uint64 - expErr bool - errContains string + name string + malleate func(srcOperatorAddr, destOperatorAddr string) []interface{} + postCheck func(bz []byte) + gas uint64 + expErr bool + wantErr error }{ { "fail - empty input args", @@ -436,7 +443,7 @@ func (s *PrecompileTestSuite) TestRedelegation() { func([]byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(0)), }, { "fail - invalid delegator address", @@ -450,7 +457,7 @@ func (s *PrecompileTestSuite) TestRedelegation() { func([]byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidDelegator, "invalid"), + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "invalid"), }, { "fail - empty src validator addr", @@ -464,7 +471,7 @@ func (s *PrecompileTestSuite) TestRedelegation() { func([]byte) {}, 100000, true, - "empty address string is not allowed", + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "fail - empty destination addr", @@ -478,7 +485,7 @@ func (s *PrecompileTestSuite) TestRedelegation() { func([]byte) {}, 100000, true, - "empty address string is not allowed", + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, ""), }, { "success", @@ -499,7 +506,7 @@ func (s *PrecompileTestSuite) TestRedelegation() { }, 100000, false, - "", + nil, }, { name: "success - no redelegation found", @@ -541,7 +548,8 @@ func (s *PrecompileTestSuite) TestRedelegation() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + s.Require().NotNil(tc.wantErr) + testutil.RequireExactError(s.T(), err, tc.wantErr) } else { s.Require().NoError(err) s.Require().NotNil(bz) @@ -559,12 +567,14 @@ func (s *PrecompileTestSuite) TestRedelegations() { ) testCases := []struct { - name string - malleate func() []interface{} - postCheck func(bz []byte) - gas uint64 - expErr bool - errContains string + name string + malleate func() []interface{} + postCheck func(bz []byte) + gas uint64 + expErr bool + wantErr error + // wantErrFn builds the expected error (e.g. match full gRPC message from the same querier as the precompile). + wantErrFn func(*PrecompileTestSuite, *abi.Method, func() []interface{}) error }{ { "fail - empty input args", @@ -574,7 +584,8 @@ func (s *PrecompileTestSuite) TestRedelegations() { func([]byte) {}, 100000, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(0)), + nil, }, { "fail - invalid delegator address", @@ -589,7 +600,16 @@ func (s *PrecompileTestSuite) TestRedelegations() { func([]byte) {}, 100000, true, - "redelegation not found", + nil, + func(s *PrecompileTestSuite, method *abi.Method, malleate func() []interface{}) error { + args := malleate() + req, rerr := staking.NewRedelegationsRequest(method, args, evmaddress.NewEvmCodec(sdk.GetConfig().GetBech32AccountAddrPrefix())) + s.Require().NoError(rerr) + q := stakingkeeper.NewQuerier(s.network.App.GetStakingKeeper()) + _, qerr := q.Redelegations(sdk.WrapSDKContext(s.network.GetContext()), req) + s.Require().Error(qerr) + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrQueryFailed, staking.RedelegationsMethod, qerr.Error()) + }, }, { "fail - invalid query | all empty args ", @@ -604,7 +624,8 @@ func (s *PrecompileTestSuite) TestRedelegations() { func([]byte) {}, 100000, true, - "invalid query. Need to specify at least a source validator address or delegator address", + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "all filter addresses empty"), + nil, }, { "fail - invalid query | only destination validator address", @@ -619,7 +640,8 @@ func (s *PrecompileTestSuite) TestRedelegations() { func([]byte) {}, 100000, true, - "invalid query. Need to specify at least a source validator address or delegator address", + cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "destination validator set without delegator or source validator"), + nil, }, { "success - specified delegator, source & destination", @@ -636,7 +658,8 @@ func (s *PrecompileTestSuite) TestRedelegations() { }, 100000, false, - "", + nil, + nil, }, { "success - specifying only source w/pagination", @@ -656,7 +679,8 @@ func (s *PrecompileTestSuite) TestRedelegations() { }, 100000, false, - "", + nil, + nil, }, { "success - get all existing redelegations for a delegator w/pagination", @@ -676,7 +700,8 @@ func (s *PrecompileTestSuite) TestRedelegations() { }, 100000, false, - "", + nil, + nil, }, } @@ -693,7 +718,14 @@ func (s *PrecompileTestSuite) TestRedelegations() { if tc.expErr { s.Require().Error(err) - s.Require().Contains(err.Error(), tc.errContains) + var wantErr error + if tc.wantErrFn != nil { + wantErr = tc.wantErrFn(s, &method, tc.malleate) + } else { + s.Require().NotNil(tc.wantErr) + wantErr = tc.wantErr + } + testutil.RequireExactError(s.T(), err, wantErr) } else { s.Require().NoError(err) s.Require().NotNil(bz) diff --git a/tests/integration/precompiles/staking/test_staking.go b/tests/integration/precompiles/staking/test_staking.go index 5efe96569..3a9d809dc 100644 --- a/tests/integration/precompiles/staking/test_staking.go +++ b/tests/integration/precompiles/staking/test_staking.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/holiman/uint256" + cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/staking" "github.com/cosmos/evm/precompiles/testutil" chainutil "github.com/cosmos/evm/testutil" @@ -127,14 +128,15 @@ func (s *PrecompileTestSuite) TestRequiredGas() { // TestRun tests the precompile's Run method. func (s *PrecompileTestSuite) TestRun() { var ctx sdk.Context + testcases := []struct { - name string - malleate func(delegator keyring.Key) []byte - gas uint64 - readOnly bool - expPass bool - expRevert bool // true if error returns ABI-encoded revert reason bytes (not OOG) - errContains string + name string + malleate func(delegator keyring.Key) []byte + gas uint64 + readOnly bool + expPass bool + expRevert bool // true if error returns ABI-encoded revert reason bytes (not OOG) + wantErrFn func() error }{ { "fail - contract gas limit is < gas cost to run a query / tx", @@ -152,7 +154,11 @@ func (s *PrecompileTestSuite) TestRun() { false, false, false, - "out of gas", + func() error { + bz, err := evmtypes.RevertReasonBytes(vm.ErrOutOfGas.Error()) + s.Require().NoError(err) + return evmtypes.NewExecErrorWithReason(bz) + }, }, { "pass - delegate transaction", @@ -170,7 +176,7 @@ func (s *PrecompileTestSuite) TestRun() { false, true, false, - "", + nil, }, { "pass - undelegate transaction", @@ -188,7 +194,7 @@ func (s *PrecompileTestSuite) TestRun() { false, true, false, - "", + nil, }, { "pass - redelegate transaction", @@ -207,7 +213,7 @@ func (s *PrecompileTestSuite) TestRun() { false, true, false, - "failed to redelegate tokens", + nil, }, { "pass - cancel unbonding delegation transaction", @@ -248,7 +254,7 @@ func (s *PrecompileTestSuite) TestRun() { false, true, false, - "", + nil, }, { "pass - delegation query", @@ -265,7 +271,7 @@ func (s *PrecompileTestSuite) TestRun() { false, true, false, - "", + nil, }, { "pass - validator query", @@ -284,7 +290,7 @@ func (s *PrecompileTestSuite) TestRun() { false, true, false, - "", + nil, }, { "pass - redelgation query", @@ -323,7 +329,7 @@ func (s *PrecompileTestSuite) TestRun() { false, true, false, - "", + nil, }, { "pass - delegation query - read only", @@ -340,7 +346,7 @@ func (s *PrecompileTestSuite) TestRun() { true, true, false, - "", + nil, }, { "pass - unbonding delegation query", @@ -379,7 +385,7 @@ func (s *PrecompileTestSuite) TestRun() { true, true, false, - "", + nil, }, { "fail - delegate method - read only", @@ -397,7 +403,10 @@ func (s *PrecompileTestSuite) TestRun() { true, false, true, - "write protection", + func() error { + s.T().Helper() + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrABISetupFailed, vm.ErrWriteProtection.Error()) + }, }, { "fail - invalid method", @@ -408,7 +417,12 @@ func (s *PrecompileTestSuite) TestRun() { false, false, true, - "no method with id", + func() error { + s.T().Helper() + _, err := staking.ABI.MethodById([]byte("invalid")[:4]) + s.Require().Error(err) + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrABISetupFailed, err.Error()) + }, }, } @@ -473,10 +487,9 @@ func (s *PrecompileTestSuite) TestRun() { s.Require().NoError(err, "expected no error when running the precompile") s.Require().NotNil(bz, "expected returned bytes not to be nil") case tc.expRevert: - s.Require().ErrorIs(err, vm.ErrExecutionReverted) - s.Require().NotNil(bz, "expected revert reason bytes") - revertErr := evmtypes.NewExecErrorWithReason(bz) - s.Require().ErrorContains(revertErr, tc.errContains) + s.Require().Error(err, "expected error to be returned when running the precompile") + s.Require().NotNil(bz, "expected returned bytes not to be nil") + testutil.RequireExactError(s.T(), evmtypes.NewExecErrorWithReason(bz), tc.wantErrFn()) default: s.Require().ErrorIs(err, vm.ErrOutOfGas) s.Require().Nil(bz, "expected nil bytes on out of gas") @@ -742,7 +755,7 @@ func (s *PrecompileTestSuite) TestCMS() { 100000, // use gas > 0 to avoid doing gas estimation false, true, - "no method with id", + vm.ErrExecutionReverted.Error(), }, } @@ -816,7 +829,7 @@ func (s *PrecompileTestSuite) TestCMS() { "expected error to be returned when running the precompile") s.Require().NotNil(resp.Ret, "expected returned bytes to be encoded error reason") execRevertErr := evmtypes.NewExecErrorWithReason(resp.Ret) - s.Require().Contains(execRevertErr.Error(), tc.errContains) + s.Require().ErrorContains(execRevertErr, tc.errContains) consumed := ctx.GasMeter().GasConsumed() // Because opCall (for calling precompile) return ErrExecutionReverted, leftOverGas is refunded. diff --git a/tests/integration/precompiles/staking/test_tx.go b/tests/integration/precompiles/staking/test_tx.go index 0e48f2241..06512fa8b 100644 --- a/tests/integration/precompiles/staking/test_tx.go +++ b/tests/integration/precompiles/staking/test_tx.go @@ -51,7 +51,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { callerAddress *common.Address postCheck func(data []byte) expError bool - errContains string + wantErrFn func(caller common.Address, createArgs []interface{}) error }{ { "fail - empty input args", @@ -62,7 +62,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 6, 0), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(6), big.NewInt(0)) + }, }, { "fail - different origin than delegator", @@ -81,7 +83,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - "does not match the requester address", + func(caller common.Address, createArgs []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrRequesterIsNotMsgSender, caller, createArgs[3]) + }, }, { "fail - invalid description", @@ -99,7 +103,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - "invalid description", + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, staking.SolidityErrInvalidDescription, "") + }, }, { "fail - invalid commission", @@ -117,7 +123,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - "invalid commission", + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, staking.SolidityErrInvalidCommission, "") + }, }, { "fail - invalid min self delegation", @@ -135,7 +143,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - "invalid amount", + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAmount, "") + }, }, { "fail - invalid validator address", @@ -153,7 +163,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - "invalid validator address", + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "1205") + }, }, { "fail - invalid pubkey", @@ -171,7 +183,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - "invalid type for", + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "1205") + }, }, { "fail - pubkey decoding error", @@ -189,7 +203,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - "illegal base64 data", + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidPubkey, "illegal base64 data at input byte 7") + }, }, { "fail - consensus pubkey len is invalid", @@ -207,7 +223,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - "consensus pubkey len is invalid", + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidPubkeySize, big.NewInt(4), big.NewInt(32)) + }, }, { "fail - invalid value", @@ -225,7 +243,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - "invalid amount", + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAmount, "") + }, }, { "fail - cannot be called from address != than validator address", @@ -243,7 +263,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { &diffAddr, func([]byte) {}, true, - "does not match the requester address", + func(caller common.Address, createArgs []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrRequesterIsNotMsgSender, caller, createArgs[3]) + }, }, { "fail - cannot be called from account with code (if it is not EIP-7702 delegated account)", @@ -262,7 +284,9 @@ func (s *PrecompileTestSuite) TestCreateValidator() { nil, func([]byte) {}, true, - staking.ErrCannotCallFromContract, + func(caller common.Address, _ []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, staking.SolidityErrCannotCallFromContract, caller, big.NewInt(2), false) + }, }, { "success", @@ -311,7 +335,7 @@ func (s *PrecompileTestSuite) TestCreateValidator() { s.Require().Equal(math.NewIntFromBigInt(minSelfDelegation), validator.MinSelfDelegation, "expected validator min self delegation to be %s; got %s", minSelfDelegation, validator.MinSelfDelegation) }, false, - "", + nil, }, } @@ -333,10 +357,14 @@ func (s *PrecompileTestSuite) TestCreateValidator() { var contract *vm.Contract contract, ctx = testutil.NewPrecompileContract(s.T(), ctx, caller, s.precompile.Address(), tc.gas) - bz, err := s.precompile.CreateValidator(ctx, contract, stDB, &method, tc.malleate()) + createArgs := tc.malleate() + bz, err := s.precompile.CreateValidator(ctx, contract, stDB, &method, createArgs) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + s.Require().NotNil(tc.wantErrFn) + wantErr := tc.wantErrFn(caller, createArgs) + s.Require().NotNil(wantErr) + testutil.RequireExactError(s.T(), err, wantErr) s.Require().Empty(bz) } else { s.Require().NoError(err) @@ -398,7 +426,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { callerAddress *common.Address postCheck func(data []byte) expError bool - errContains string + wantErrFn func(caller common.Address, args []interface{}, stDB *statedb.StateDB) error }{ { "fail - empty input args", @@ -409,7 +437,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { nil, func([]byte) {}, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + func(common.Address, []interface{}, *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(0)) + }, }, { "fail - different origin than delegator", @@ -426,7 +456,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { nil, func([]byte) {}, true, - "does not match the requester address", + func(caller common.Address, args []interface{}, _ *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrRequesterIsNotMsgSender, caller, args[1]) + }, }, { "fail - invalid description", @@ -442,7 +474,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { nil, func([]byte) {}, true, - "invalid description", + func(common.Address, []interface{}, *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, staking.SolidityErrInvalidDescription, "") + }, }, { "fail - invalid commission rate", @@ -458,7 +492,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { nil, func([]byte) {}, true, - "invalid type for commissionRate", + func(common.Address, []interface{}, *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAmount, "") + }, }, { "fail - invalid min self delegation", @@ -474,7 +510,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { nil, func([]byte) {}, true, - "invalid type for minSelfDelegation", + func(common.Address, []interface{}, *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAmount, "") + }, }, { "fail - invalid validator address", @@ -490,7 +528,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { nil, func([]byte) {}, true, - "invalid validator address", + func(common.Address, []interface{}, *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "1205") + }, }, { "fail - commission change rate too high", @@ -506,7 +546,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { nil, func([]byte) {}, true, - "commission cannot be changed more than max change rate", + func(common.Address, []interface{}, *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrMsgServerFailed, staking.EditValidatorMethod, "commission cannot be changed more than max change rate") + }, }, { "fail - negative commission rate", @@ -522,7 +564,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { nil, func([]byte) {}, true, - "commission rate must be between 0 and 1 (inclusive)", + func(common.Address, []interface{}, *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrMsgServerFailed, staking.EditValidatorMethod, "commission rate must be between 0 and 1 (inclusive): invalid request") + }, }, { "fail - negative min self delegation", @@ -538,7 +582,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { nil, func([]byte) {}, true, - "minimum self delegation must be a positive integer", + func(common.Address, []interface{}, *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrMsgServerFailed, staking.EditValidatorMethod, "minimum self delegation must be a positive integer: invalid request") + }, }, { "fail - cannot be called from account with code (if it is not EIP-7702 delegated account)", @@ -557,7 +603,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { }(), func([]byte) {}, true, - "does not match the requester address", + func(caller common.Address, args []interface{}, _ *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrRequesterIsNotMsgSender, caller, args[1]) + }, }, { "fail - cannot be called from smart contract", @@ -574,7 +622,9 @@ func (s *PrecompileTestSuite) TestEditValidator() { nil, func([]byte) {}, true, - staking.ErrCannotCallFromContract, + func(caller common.Address, _ []interface{}, stDB *statedb.StateDB) error { + return cmn.NewRevertWithSolidityError(staking.ABI, staking.SolidityErrCannotCallFromContract, caller, big.NewInt(2), false) + }, }, { "success", @@ -610,7 +660,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { s.Require().Equal(minSelfDelegation, editValidatorEvent.MinSelfDelegation) }, false, - "", + nil, }, { "success - should not update commission rate", @@ -646,7 +696,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { s.Require().Equal(validatorAddress, editValidatorEvent.ValidatorAddress) }, false, - "", + nil, }, { "success - should not update minimum self delegation", @@ -682,7 +732,7 @@ func (s *PrecompileTestSuite) TestEditValidator() { s.Require().Equal(validatorAddress, editValidatorEvent.ValidatorAddress) }, false, - "", + nil, }, } @@ -708,10 +758,14 @@ func (s *PrecompileTestSuite) TestEditValidator() { var contract *vm.Contract contract, ctx = testutil.NewPrecompileContract(s.T(), ctx, caller, s.precompile.Address(), tc.gas) - bz, err := s.precompile.EditValidator(ctx, contract, stDB, &method, tc.malleate()) + editArgs := tc.malleate() + bz, err := s.precompile.EditValidator(ctx, contract, stDB, &method, editArgs) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + s.Require().NotNil(tc.wantErrFn) + wantErr := tc.wantErrFn(caller, editArgs, stDB) + s.Require().NotNil(wantErr) + testutil.RequireExactError(s.T(), err, wantErr) s.Require().Empty(bz) } else { s.Require().NoError(err) @@ -759,7 +813,7 @@ func (s *PrecompileTestSuite) TestDelegate() { expDelegationShares *big.Int postCheck func(data []byte) expError bool - errContains string + wantErrFn func(caller common.Address, delegateArgs []interface{}) error }{ { "fail - empty input args", @@ -770,7 +824,9 @@ func (s *PrecompileTestSuite) TestDelegate() { big.NewInt(0), func([]byte) {}, true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(0)) + }, }, { name: "fail - different origin than delegator", @@ -782,9 +838,11 @@ func (s *PrecompileTestSuite) TestDelegate() { big.NewInt(1e18), } }, - gas: 200000, - expError: true, - errContains: "does not match the requester address", + gas: 200000, + expError: true, + wantErrFn: func(caller common.Address, delegateArgs []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrRequesterIsNotMsgSender, caller, delegateArgs[0]) + }, }, { "fail - invalid delegator address", @@ -799,7 +857,9 @@ func (s *PrecompileTestSuite) TestDelegate() { big.NewInt(1), func([]byte) {}, true, - fmt.Sprintf(cmn.ErrInvalidDelegator, ""), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "") + }, }, { "fail - invalid amount", @@ -814,7 +874,9 @@ func (s *PrecompileTestSuite) TestDelegate() { big.NewInt(1), func([]byte) {}, true, - fmt.Sprintf(cmn.ErrInvalidAmount, nil), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", nil)) + }, }, { "fail - delegation failed because of insufficient funds", @@ -831,7 +893,16 @@ func (s *PrecompileTestSuite) TestDelegate() { big.NewInt(15), func([]byte) {}, true, - "insufficient funds", + func(common.Address, []interface{}) error { + ctx := s.network.GetContext() + delegator := s.keyring.GetKey(0) + bal := s.network.App.GetBankKeeper().GetBalance(ctx, delegator.AccAddr, s.bondDenom) + amt, ok := math.NewIntFromString("1000000000000000000000000000") + s.Require().True(ok) + wantCoin := sdk.NewCoin(s.bondDenom, amt) + return cmn.NewRevertWithSolidityError(s.precompile.ABI, cmn.SolidityErrMsgServerFailed, staking.DelegateMethod, + fmt.Sprintf("failed to delegate; %s is smaller than %s: insufficient funds", bal, wantCoin)) + }, }, { "success", @@ -857,7 +928,7 @@ func (s *PrecompileTestSuite) TestDelegate() { s.Require().Equal(log.BlockNumber, uint64(s.network.GetContext().BlockHeight())) //nolint:gosec // G115 }, false, - "", + nil, }, } @@ -883,7 +954,8 @@ func (s *PrecompileTestSuite) TestDelegate() { delegation, delErr := s.network.App.GetStakingKeeper().Delegation(ctx, delegator.AccAddr, valAddr) s.Require().NoError(delErr) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + s.Require().NotNil(tc.wantErrFn) + testutil.RequireExactError(s.T(), err, tc.wantErrFn(delegator.Addr, delegateArgs)) s.Require().Empty(bz) s.Require().Equal(s.network.GetValidators()[0].DelegatorShares, delegation.GetShares()) } else { @@ -914,7 +986,7 @@ func (s *PrecompileTestSuite) TestUndelegate() { gas uint64 expUndelegationShares *big.Int expError bool - errContains string + wantErrFn func(caller common.Address, undelegateArgs []interface{}) error }{ { "fail - empty input args", @@ -925,7 +997,9 @@ func (s *PrecompileTestSuite) TestUndelegate() { 200000, big.NewInt(0), true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 3, 0), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(3), big.NewInt(0)) + }, }, { name: "fail - different origin than delegator", @@ -937,9 +1011,11 @@ func (s *PrecompileTestSuite) TestUndelegate() { big.NewInt(1000000000000000000), } }, - gas: 200000, - expError: true, - errContains: "does not match the requester address", + gas: 200000, + expError: true, + wantErrFn: func(caller common.Address, undelegateArgs []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrRequesterIsNotMsgSender, caller, undelegateArgs[0]) + }, }, { "fail - invalid delegator address", @@ -954,7 +1030,9 @@ func (s *PrecompileTestSuite) TestUndelegate() { 200000, big.NewInt(1), true, - fmt.Sprintf(cmn.ErrInvalidDelegator, ""), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "") + }, }, { "fail - invalid amount", @@ -969,7 +1047,9 @@ func (s *PrecompileTestSuite) TestUndelegate() { 200000, big.NewInt(1), true, - fmt.Sprintf(cmn.ErrInvalidAmount, nil), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", nil)) + }, }, { "success", @@ -997,7 +1077,7 @@ func (s *PrecompileTestSuite) TestUndelegate() { 20000, big.NewInt(1000000000000000000), false, - "", + nil, }, } @@ -1019,7 +1099,8 @@ func (s *PrecompileTestSuite) TestUndelegate() { undelegations, _ := s.network.App.GetStakingKeeper().GetAllUnbondingDelegations(ctx, delegator.AccAddr) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + s.Require().NotNil(tc.wantErrFn) + testutil.RequireExactError(s.T(), err, tc.wantErrFn(delegator.Addr, undelegateArgs)) s.Require().Empty(bz) } else { s.Require().NoError(err) @@ -1045,7 +1126,7 @@ func (s *PrecompileTestSuite) TestRedelegate() { gas uint64 expRedelegationShares *big.Int expError bool - errContains string + wantErrFn func(caller common.Address, redelegateArgs []interface{}) error }{ { "fail - empty input args", @@ -1056,7 +1137,9 @@ func (s *PrecompileTestSuite) TestRedelegate() { 200000, big.NewInt(0), true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(0)) + }, }, { name: "fail - different origin than delegator", @@ -1069,9 +1152,11 @@ func (s *PrecompileTestSuite) TestRedelegate() { big.NewInt(1000000000000000000), } }, - gas: 200000, - expError: true, - errContains: "does not match the requester address", + gas: 200000, + expError: true, + wantErrFn: func(caller common.Address, redelegateArgs []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrRequesterIsNotMsgSender, caller, redelegateArgs[0]) + }, }, { "fail - invalid delegator address", @@ -1087,7 +1172,9 @@ func (s *PrecompileTestSuite) TestRedelegate() { 200000, big.NewInt(1), true, - fmt.Sprintf(cmn.ErrInvalidDelegator, ""), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "") + }, }, { "fail - invalid amount", @@ -1103,7 +1190,9 @@ func (s *PrecompileTestSuite) TestRedelegate() { 200000, big.NewInt(1), true, - fmt.Sprintf(cmn.ErrInvalidAmount, nil), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", nil)) + }, }, { "fail - invalid shares amount", @@ -1119,7 +1208,9 @@ func (s *PrecompileTestSuite) TestRedelegate() { 200000, big.NewInt(1), true, - "invalid shares amount", + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrMsgServerFailed, staking.RedelegateMethod, "invalid shares amount: invalid request") + }, }, { "success", @@ -1145,7 +1236,7 @@ func (s *PrecompileTestSuite) TestRedelegate() { 200000, big.NewInt(1), false, - "", + nil, }, } @@ -1169,7 +1260,8 @@ func (s *PrecompileTestSuite) TestRedelegate() { s.Require().NoError(redelErr) if tc.expError { - s.Require().ErrorContains(err, tc.errContains) + s.Require().NotNil(tc.wantErrFn) + testutil.RequireExactError(s.T(), err, tc.wantErrFn(delegator.Addr, redelegateArgs)) s.Require().Empty(bz) } else { s.Require().NoError(err) @@ -1196,7 +1288,7 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { gas uint64 expDelegatedShares *big.Int expError bool - errContains string + wantErrFn func(caller common.Address, cancelArgs []interface{}) error }{ { "fail - empty input args", @@ -1207,7 +1299,9 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { 200000, big.NewInt(0), true, - fmt.Sprintf(cmn.ErrInvalidNumberOfArgs, 4, 0), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidNumberOfArgs, big.NewInt(4), big.NewInt(0)) + }, }, { "fail - invalid delegator address", @@ -1223,7 +1317,9 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { 200000, big.NewInt(1), true, - fmt.Sprintf(cmn.ErrInvalidDelegator, ""), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAddress, "") + }, }, { "fail - creation height", @@ -1239,23 +1335,9 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { 200000, big.NewInt(1), true, - "invalid creation height", - }, - { - "fail - invalid amount", - func(delegator testkeyring.Key, operatorAddress string) []interface{} { - return []interface{}{ - delegator.Addr, - operatorAddress, - nil, - big.NewInt(1), - } + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidHeight, fmt.Sprintf("%v", nil)) }, - func([]byte) {}, - 200000, - big.NewInt(1), - true, - fmt.Sprintf(cmn.ErrInvalidAmount, nil), }, { "fail - invalid amount", @@ -1271,10 +1353,12 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { 200000, big.NewInt(1), true, - fmt.Sprintf(cmn.ErrInvalidAmount, nil), + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrInvalidAmount, fmt.Sprintf("%v", nil)) + }, }, { - "fail - invalid shares amount", + "fail - negative cancel amount", func(delegator testkeyring.Key, operatorAddress string) []interface{} { return []interface{}{ delegator.Addr, @@ -1287,7 +1371,9 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { 200000, big.NewInt(1), true, - "invalid amount: invalid request", + func(common.Address, []interface{}) error { + return cmn.NewRevertWithSolidityError(staking.ABI, cmn.SolidityErrMsgServerFailed, staking.CancelUnbondingDelegationMethod, "invalid amount: invalid request") + }, }, { "success", @@ -1307,7 +1393,7 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { 200000, big.NewInt(1), false, - "", + nil, }, } @@ -1324,7 +1410,8 @@ func (s *PrecompileTestSuite) TestCancelUnbondingDelegation() { if tc.expError { bz, err := s.precompile.CancelUnbondingDelegation(ctx, contract, stDB, &method, cancelArgs) - s.Require().ErrorContains(err, tc.errContains) + s.Require().NotNil(tc.wantErrFn) + testutil.RequireExactError(s.T(), err, tc.wantErrFn(delegator.Addr, cancelArgs)) s.Require().Empty(bz) } else { undelegateArgs := []interface{}{ diff --git a/tests/integration/precompiles/werc20/test_integration.go b/tests/integration/precompiles/werc20/test_integration.go index ae442f3dd..a6828897d 100644 --- a/tests/integration/precompiles/werc20/test_integration.go +++ b/tests/integration/precompiles/werc20/test_integration.go @@ -11,6 +11,7 @@ import ( //nolint:revive // dot imports are fine for Ginkgo . "github.com/onsi/gomega" + cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/erc20" "github.com/cosmos/evm/precompiles/testutil" "github.com/cosmos/evm/precompiles/werc20" @@ -455,7 +456,10 @@ func TestPrecompileIntegrationTestSuite(t *testing.T, create network.CreateEvmAp It("it should fail to transfer tokens to a receiver using `transferFrom`", func() { txArgs, transferArgs := callsData.getTxAndCallArgs(directCall, erc20.TransferFromMethod, txSender.Addr, user.Addr, transferAmount) - insufficientAllowanceCheck := failCheck.WithErrContains(erc20.ErrInsufficientAllowance.Error()) + insufficientAllowanceCheck := failCheck.WithErrExact(cmn.NewRevertWithSolidityError( + is.precompile.ABI, erc20.SolidityErrERC20InsufficientAllowance, + txSender.Addr, common.Big0, transferAmount, + )) _, _, err := is.factory.CallContractAndCheckLogs(txSender.Priv, txArgs, transferArgs, insufficientAllowanceCheck) Expect(err).ToNot(HaveOccurred(), "unexpected result calling contract") Expect(is.network.NextBlock()).ToNot(HaveOccurred(), "error on NextBlock after transfer") diff --git a/tests/solidity/suites/precompiles/hardhat.config.js b/tests/solidity/suites/precompiles/hardhat.config.js index 019d79017..f7d8e02e1 100644 --- a/tests/solidity/suites/precompiles/hardhat.config.js +++ b/tests/solidity/suites/precompiles/hardhat.config.js @@ -5,7 +5,7 @@ module.exports = { solidity: { compilers: [ { - version: "0.8.18", + version: "0.8.20", }, // This version is required to compile the werc9 contract. { diff --git a/tests/solidity/suites/precompiles/test/3_erc20/erc20.js b/tests/solidity/suites/precompiles/test/3_erc20/erc20.js index daedebc2b..64158a5c7 100644 --- a/tests/solidity/suites/precompiles/test/3_erc20/erc20.js +++ b/tests/solidity/suites/precompiles/test/3_erc20/erc20.js @@ -9,7 +9,7 @@ describe('ERC20 Precompile', function () { before(async function () { [owner, spender, recipient] = await hre.ethers.getSigners() erc20 = await hre.ethers.getContractAt( - 'IERC20Metadata', + 'ERC20I', '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE' ) }) diff --git a/tests/solidity/suites/revert_cases/hardhat.config.js b/tests/solidity/suites/revert_cases/hardhat.config.js index 019d79017..f7d8e02e1 100644 --- a/tests/solidity/suites/revert_cases/hardhat.config.js +++ b/tests/solidity/suites/revert_cases/hardhat.config.js @@ -5,7 +5,7 @@ module.exports = { solidity: { compilers: [ { - version: "0.8.18", + version: "0.8.20", }, // This version is required to compile the werc9 contract. { diff --git a/tests/solidity/suites/revert_cases/test/common.js b/tests/solidity/suites/revert_cases/test/common.js index 5291c324f..7f874b8fd 100644 --- a/tests/solidity/suites/revert_cases/test/common.js +++ b/tests/solidity/suites/revert_cases/test/common.js @@ -14,9 +14,12 @@ const DEFAULT_GAS_LIMIT = 1_000_000 const LARGE_GAS_LIMIT = 10_000_000 const LOW_GAS_LIMIT=50_000 -const PANIC_ASSERT_0x01 = "Panic(1)" -const PANIC_DIVISION_BY_ZERO_0x12 = "Panic(18)" -const PANIC_ARRAY_OUT_OF_BOUND_0x32 = "Panic(50)" +const PANIC_NAME = "Panic" +const PANIC_CODE_0x01 = 1 +const PANIC_CODE_0x12 = 18 +const PANIC_CODE_0x32 = 50 + +const ERROR_NAME = "Error" module.exports = { // Precompile Addresses @@ -34,8 +37,10 @@ module.exports = { LARGE_GAS_LIMIT, LOW_GAS_LIMIT, - // Panics - PANIC_ASSERT_0x01, - PANIC_DIVISION_BY_ZERO_0x12, - PANIC_ARRAY_OUT_OF_BOUND_0x32 + // Built-in error decoding + PANIC_NAME, + PANIC_CODE_0x01, + PANIC_CODE_0x12, + PANIC_CODE_0x32, + ERROR_NAME, } \ No newline at end of file diff --git a/tests/solidity/suites/revert_cases/test/precompile_revert_cases.js b/tests/solidity/suites/revert_cases/test/precompile_revert_cases.js index ce397d0ff..8b5f1cc45 100644 --- a/tests/solidity/suites/revert_cases/test/precompile_revert_cases.js +++ b/tests/solidity/suites/revert_cases/test/precompile_revert_cases.js @@ -2,9 +2,8 @@ const { expect } = require('chai'); const hre = require('hardhat'); const { LARGE_GAS_LIMIT, LOW_GAS_LIMIT } = require('./common'); const { - decodeRevertReason, analyzeFailedTransaction, - verifyTransactionRevert, + parseEthersError, verifyOutOfGasError } = require('./test_helper') @@ -12,6 +11,7 @@ describe('Precompile Revert Cases E2E Tests', function () { let revertTestContract, precompileWrapper; let validValidatorAddress, invalidValidatorAddress; let analysis, decodedReason; + let stakingIface, distributionIface; before(async function () { [signer] = await hre.ethers.getSigners(); @@ -39,6 +39,11 @@ describe('Precompile Revert Cases E2E Tests', function () { console.log('RevertTestContract deployed at:', await revertTestContract.getAddress()); console.log('PrecompileWrapper deployed at:', await precompileWrapper.getAddress()); + // Load per-precompile ABIs (with module-specific custom errors). + // These are interfaces (abstract), so use getContractAt to access their interface/ABI. + stakingIface = (await hre.ethers.getContractAt('StakingI', hre.ethers.ZeroAddress)).interface; + distributionIface = (await hre.ethers.getContractAt('DistributionI', hre.ethers.ZeroAddress)).interface; + analysis = null; decodedReason = null; }); @@ -46,92 +51,93 @@ describe('Precompile Revert Cases E2E Tests', function () { describe('Direct Precompile Call Reverts', function () { it('should handle direct staking precompile revert', async function () { try { - const tx = await revertTestContract.directStakingRevert(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); - await tx.wait(); - expect.fail('Transaction should have reverted'); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash) + await revertTestContract.directStakingRevert.staticCall(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); + expect.fail('Call should have reverted'); + } catch (e) { + const parsed = parseEthersError(stakingIface, e.data); + expect(parsed.name).to.equal("InvalidAddress"); + expect(String(parsed.args[0])).to.include(invalidValidatorAddress); } - verifyTransactionRevert(analysis, "invalid validator address") }); it('should handle direct distribution precompile revert', async function () { try { - const tx = await revertTestContract.directDistributionRevert(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); - await tx.wait(); - expect.fail('Transaction should have reverted'); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash) + await revertTestContract.directDistributionRevert.staticCall(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); + expect.fail('Call should have reverted'); + } catch (e) { + const parsed = parseEthersError(distributionIface, e.data); + expect(parsed.name).to.equal("InvalidAddress"); + expect(String(parsed.args[0])).to.include(invalidValidatorAddress); } - verifyTransactionRevert(analysis, "invalid validator address") }); it('should handle direct bank precompile revert', async function () { // directBankRevert is a view function, so it should revert immediately try { - await revertTestContract.directBankRevert(); + await revertTestContract.directBankRevert.staticCall(); expect.fail('Call should have reverted'); } catch (error) { - decodedReason = decodeRevertReason(error.data) + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal("Error"); + expect(String(parsed.args[0])).to.include("intended revert"); } - expect(decodedReason).contains("intended revert") }); it('should capture precompile revert reason through transaction receipt', async function () { try { - const tx = await revertTestContract.directStakingRevert(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); - await tx.wait(); - expect.fail('Transaction should have reverted'); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash) + await revertTestContract.directStakingRevert.staticCall(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); + expect.fail('Call should have reverted'); + } catch (e) { + const parsed = parseEthersError(stakingIface, e.data); + expect(parsed.name).to.equal("InvalidAddress"); + expect(String(parsed.args[0])).to.include(invalidValidatorAddress); } - verifyTransactionRevert(analysis, "invalid validator address") }); }); describe('Precompile Call Via Contract Reverts', function () { it('should handle precompile call via contract revert', async function () { try { - const tx = await revertTestContract.precompileViaContractRevert(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); - await tx.wait(); - expect.fail('Transaction should have reverted'); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash) + await revertTestContract.precompileViaContractRevert.staticCall(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); + expect.fail('Call should have reverted'); + } catch (e) { + const parsed = parseEthersError(stakingIface, e.data); + expect(parsed.name).to.equal("InvalidAddress"); + expect(String(parsed.args[0])).to.include(invalidValidatorAddress); } - verifyTransactionRevert(analysis, "invalid validator address") }); it('should handle multiple precompile calls with revert', async function () { try { - const tx = await revertTestContract.multiplePrecompileCallsWithRevert(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); - await tx.wait(); - expect.fail('Transaction should have reverted'); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash) + await revertTestContract.multiplePrecompileCallsWithRevert.staticCall(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); + expect.fail('Call should have reverted'); + } catch (e) { + const parsed = parseEthersError(stakingIface, e.data); + expect(parsed.name).to.equal("InvalidAddress"); + expect(String(parsed.args[0])).to.include(invalidValidatorAddress); } - verifyTransactionRevert(analysis, "invalid validator address") }); it('should handle wrapper contract precompile revert', async function () { try { - const tx = await precompileWrapper.wrappedStakingCall(invalidValidatorAddress, 1, { gasLimit: LARGE_GAS_LIMIT }); - await tx.wait(); - expect.fail('Transaction should have reverted'); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash) + await precompileWrapper.wrappedStakingCall.staticCall(invalidValidatorAddress, 1, { gasLimit: LARGE_GAS_LIMIT }); + expect.fail('Call should have reverted'); + } catch (e) { + const parsed = parseEthersError(stakingIface, e.data); + expect(parsed.name).to.equal("InvalidAddress"); + expect(String(parsed.args[0])).to.include(invalidValidatorAddress); } - verifyTransactionRevert(analysis, "invalid validator address") }); it('should capture wrapper revert reason via transaction receipt', async function () { try { - const tx = await precompileWrapper.wrappedDistributionCall(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); - await tx.wait(); - expect.fail('Transaction should have reverted'); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash) + await precompileWrapper.wrappedDistributionCall.staticCall(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }); + expect.fail('Call should have reverted'); + } catch (e) { + const parsed = parseEthersError(distributionIface, e.data); + expect(parsed.name).to.equal("InvalidAddress"); + expect(String(parsed.args[0])).to.include(invalidValidatorAddress); } - verifyTransactionRevert(analysis, "invalid validator address") }); }); @@ -176,7 +182,7 @@ describe('Precompile Revert Cases E2E Tests', function () { await tx.wait(); expect.fail('Transaction should have failed with OutOfGas'); } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); + analysis = await analyzeFailedTransaction(error.receipt.hash) } verifyOutOfGasError(analysis) }); @@ -187,25 +193,43 @@ describe('Precompile Revert Cases E2E Tests', function () { const testCases = [ { name: 'Staking Precompile Revert', - call: () => revertTestContract.directStakingRevert(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }), - expectedReason: "invalid validator address" + call: () => revertTestContract.directStakingRevert.staticCall(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }), + expectedReason: { + name: "InvalidAddress", + args: [ + invalidValidatorAddress, + ], + }, + iface: stakingIface, + }, { name: 'Distribution Precompile Revert', - call: () => revertTestContract.directDistributionRevert(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }), - expectedReason: "invalid validator address" + call: () => revertTestContract.directDistributionRevert.staticCall(invalidValidatorAddress, { gasLimit: LARGE_GAS_LIMIT }), + expectedReason: "InvalidAddress", + expectedReason: { + name: "InvalidAddress", + args: [ + invalidValidatorAddress, + ], + }, + iface: distributionIface, } ]; for (const testCase of testCases) { try { - const tx = await testCase.call(); - await tx.wait() + await testCase.call(); expect.fail(`${testCase.name} should have reverted`); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); + } catch (e) { + const parsed = parseEthersError(testCase.iface, e.data); + expect(parsed.name).to.equal(testCase.expectedReason.name); + + const expArgs = testCase.expectedReason.args || []; + for (let i = 0; i < expArgs.length; i++) { + expect(String(parsed.args[i])).to.include(String(expArgs[i])); + } } - verifyTransactionRevert(analysis, testCase.expectedReason) } }); @@ -224,13 +248,10 @@ describe('Precompile Revert Cases E2E Tests', function () { data: revertTestContract.interface.encodeFunctionData('directStakingRevert', [invalidValidatorAddress]), gasLimit: LARGE_GAS_LIMIT }); - } catch (callError) { - expect(callError.data).to.match(/^0x/); // Should be hex-encoded - console.log('Precompile error data (hex):', callError.data); - - const decoded = decodeRevertReason(callError.data); - expect(decoded).to.include("invalid validator address"); - console.log('Decoded precompile reason:', decoded); + } catch (e) { + const parsed = parseEthersError(distributionIface, e.data); + expect(parsed.name).to.equal("InvalidAddress"); + expect(String(parsed.args[0])).to.include(invalidValidatorAddress); } } } diff --git a/tests/solidity/suites/revert_cases/test/standard_revert_cases.js b/tests/solidity/suites/revert_cases/test/standard_revert_cases.js index 87e1e608f..52c35e345 100644 --- a/tests/solidity/suites/revert_cases/test/standard_revert_cases.js +++ b/tests/solidity/suites/revert_cases/test/standard_revert_cases.js @@ -4,14 +4,15 @@ const { DEFAULT_GAS_LIMIT, LARGE_GAS_LIMIT, LOW_GAS_LIMIT, - PANIC_ASSERT_0x01, - PANIC_DIVISION_BY_ZERO_0x12, - PANIC_ARRAY_OUT_OF_BOUND_0x32 + ERROR_NAME, + PANIC_NAME, + PANIC_CODE_0x01, + PANIC_CODE_0x12, + PANIC_CODE_0x32 } = require('./common'); const { - decodeRevertReason, analyzeFailedTransaction, - verifyTransactionRevert, + parseEthersError, verifyOutOfGasError } = require('./test_helper') @@ -52,46 +53,30 @@ describe('Standard Revert Cases E2E Tests', function () { describe('Standard Contract Call Reverts', function () { it('should handle standard revert with custom message', async function () { const customMessage = "Custom revert message"; - try { - const tx = await standardRevertTestContract.standardRevert(customMessage, { gasLimit: DEFAULT_GAS_LIMIT }); - await tx.wait(); - expect.fail('Transaction should have reverted'); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); - } - verifyTransactionRevert(analysis, customMessage); - // Verify we can capture the revert reason via static call try { await standardRevertTestContract.standardRevert.staticCall(customMessage); expect.fail('Static call should have reverted'); } catch (error) { - decodedReason = decodeRevertReason(error.data); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(ERROR_NAME); + expect(String(parsed.args[0])).to.include(customMessage); } - expect(decodedReason).to.include(customMessage); }); it('should handle require revert with proper error message', async function () { const value = 100; const threshold = 50; - try { - const tx = await standardRevertTestContract.requireRevert(value, threshold, { gasLimit: DEFAULT_GAS_LIMIT }); - await tx.wait(); - expect.fail('Transaction should have reverted'); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); - } - verifyTransactionRevert(analysis, "Value exceeds threshold"); - // Verify we can capture the revert reason via static call try { await standardRevertTestContract.requireRevert.staticCall(value, threshold); expect.fail('Static call should have reverted'); } catch (error) { - decodedReason = decodeRevertReason(error.data); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(ERROR_NAME); + expect(String(parsed.args[0])).to.include("Value exceeds threshold"); } - expect(decodedReason).to.include("Value exceeds threshold"); // Verify successful case (no revert when value < threshold) const successTx = await standardRevertTestContract.requireRevert(25, 50, { gasLimit: DEFAULT_GAS_LIMIT }); @@ -100,23 +85,16 @@ describe('Standard Revert Cases E2E Tests', function () { }); it('should handle assert revert (Panic error)', async function () { - try { - const tx = await standardRevertTestContract.assertRevert({ gasLimit: DEFAULT_GAS_LIMIT }); - await tx.wait(); - expect.fail('Transaction should have reverted'); - } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); - } - verifyTransactionRevert(analysis, PANIC_ASSERT_0x01); // Verify we can capture the revert reason via static call try { await standardRevertTestContract.assertRevert.staticCall(); expect.fail('Static call should have reverted'); } catch (error) { - decodedReason = decodeRevertReason(error.data); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(PANIC_NAME); + expect(parsed.args[0]).to.equal(PANIC_CODE_0x01); } - expect(decodedReason).to.include(PANIC_ASSERT_0x01); }); it('should handle division by zero (View Panic error)', async function () { @@ -124,20 +102,22 @@ describe('Standard Revert Cases E2E Tests', function () { await standardRevertTestContract.divisionByZero(); expect.fail('View call should have reverted'); } catch (error) { - decodedReason = decodeRevertReason(error.data); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(PANIC_NAME); + expect(parsed.args[0]).to.equal(PANIC_CODE_0x12); } - expect(decodedReason).to.include(PANIC_DIVISION_BY_ZERO_0x12); }); it('should handle division by zero (Transaction Panic error)', async function () { try { - const tx = await standardRevertTestContract.divisionByZeroTx({ gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.divisionByZeroTx.staticCall({ gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); expect.fail('Transaction should have reverted'); } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(PANIC_NAME); + expect(parsed.args[0]).to.equal(PANIC_CODE_0x12); } - verifyTransactionRevert(analysis, PANIC_DIVISION_BY_ZERO_0x12); }); it('should handle array out of bounds (View Panic error)', async function () { @@ -145,67 +125,73 @@ describe('Standard Revert Cases E2E Tests', function () { await standardRevertTestContract.arrayOutOfBounds(); expect.fail('View call should have reverted'); } catch (error) { - decodedReason = decodeRevertReason(error.data); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(PANIC_NAME); + expect(parsed.args[0]).to.equal(PANIC_CODE_0x32); } - expect(decodedReason).contains(PANIC_ARRAY_OUT_OF_BOUND_0x32); }); it('should handle array out of bounds (Transaction Panic error)', async function () { try { - const tx = await standardRevertTestContract.arrayOutOfBoundsTx({ gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.arrayOutOfBoundsTx.staticCall({ gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); expect.fail('Transaction should have reverted'); } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(PANIC_NAME); + expect(parsed.args[0]).to.equal(PANIC_CODE_0x32); } - verifyTransactionRevert(analysis, PANIC_ARRAY_OUT_OF_BOUND_0x32); }); it('should capture revert reason through eth_getTransactionReceipt', async function () { try { - const tx = await standardRevertTestContract.standardRevert("Test message", { gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.standardRevert.staticCall("Test message", { gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); expect.fail('Transaction should have reverted'); } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(ERROR_NAME); + expect(String(parsed.args[0])).to.include("Test message"); } - verifyTransactionRevert(analysis, "Test message"); }); }); describe('Complex Revert Scenarios', function () { it('should handle multiple calls with revert', async function () { try { - const tx = await standardRevertTestContract.multipleCallsWithRevert({ gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.multipleCallsWithRevert.staticCall({ gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); expect.fail('Transaction should have reverted'); } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(ERROR_NAME); + expect(String(parsed.args[0])).to.include("Multiple calls revert"); } - verifyTransactionRevert(analysis, "Multiple calls revert"); }); it('should handle try-catch revert scenario', async function () { try { - const tx = await standardRevertTestContract.tryCatchRevert(true, { gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.tryCatchRevert.staticCall(true, { gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); expect.fail('Transaction should have reverted'); } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(ERROR_NAME); + expect(String(parsed.args[0])).to.include("Internal function revert"); } - verifyTransactionRevert(analysis, "Internal function revert"); }); it('should handle wrapper contract revert', async function () { const contractAddress = await standardRevertTestContract.getAddress(); try { - const tx = await simpleWrapper.wrappedStandardCall(contractAddress, "Wrapper test", { gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await simpleWrapper.wrappedStandardCall.staticCall(contractAddress, "Wrapper test", { gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); expect.fail('Transaction should have reverted'); } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(ERROR_NAME); + expect(String(parsed.args[0])).to.include("Wrapper test"); } - verifyTransactionRevert(analysis, "Wrapper test"); }); }); @@ -274,42 +260,47 @@ describe('Standard Revert Cases E2E Tests', function () { { name: 'Standard Revert', call: async () => { - const tx = await standardRevertTestContract.standardRevert("Standard error", { gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.standardRevert.staticCall("Standard error", { gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); }, - expectedReason: "Standard error" + expectedErrName: ERROR_NAME, + expectedErrReason: "Standard error" }, { name: 'Require Revert', call: async () => { - const tx = await standardRevertTestContract.requireRevert(100, 50, { gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.requireRevert.staticCall(100, 50, { gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); }, - expectedReason: "Value exceeds threshold" + expectedErrName: ERROR_NAME, + expectedErrReason: "Value exceeds threshold" }, { name: 'Assert Revert', call: async () => { - const tx = await standardRevertTestContract.assertRevert({ gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.assertRevert.staticCall({ gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); }, - expectedReason: PANIC_ASSERT_0x01 + expectedErrName: PANIC_NAME, + expectedErrReason: PANIC_CODE_0x01 }, { name: 'Division by Zero (Transaction)', call: async () => { - const tx = await standardRevertTestContract.divisionByZeroTx({ gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.divisionByZeroTx.staticCall({ gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); }, - expectedReason: PANIC_DIVISION_BY_ZERO_0x12 + expectedErrName: PANIC_NAME, + expectedErrReason: PANIC_CODE_0x12 }, { name: 'Array Out of Bounds (Transaction)', call: async () => { - const tx = await standardRevertTestContract.arrayOutOfBoundsTx({ gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.arrayOutOfBoundsTx.staticCall({ gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); }, - expectedReason: PANIC_ARRAY_OUT_OF_BOUND_0x32 + expectedErrName: PANIC_NAME, + expectedErrReason: PANIC_CODE_0x32 } ]; @@ -318,12 +309,14 @@ describe('Standard Revert Cases E2E Tests', function () { { name: 'Division by Zero (View)', call: async () => await standardRevertTestContract.divisionByZero(), - expectedReason: PANIC_DIVISION_BY_ZERO_0x12 + expectedErrName: PANIC_NAME, + expectedErrReason: PANIC_CODE_0x12 }, { name: 'Array Out of Bounds (View)', call: async () => await standardRevertTestContract.arrayOutOfBounds(), - expectedReason: PANIC_ARRAY_OUT_OF_BOUND_0x32 + expectedErrName: PANIC_NAME, + expectedErrReason: PANIC_CODE_0x32 } ]; @@ -333,9 +326,10 @@ describe('Standard Revert Cases E2E Tests', function () { await testCase.call(); expect.fail(`${testCase.name} should have reverted`); } catch (error) { - analysis = await analyzeFailedTransaction(error.receipt.hash); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(testCase.expectedErrName); + expect(String(parsed.args[0])).to.include(testCase.expectedErrReason); } - verifyTransactionRevert(analysis, testCase.expectedReason); } // Test view functions (no receipts) @@ -344,30 +338,22 @@ describe('Standard Revert Cases E2E Tests', function () { await testCase.call(); expect.fail(`${testCase.name} should have reverted`); } catch (error) { - decodedReason = decodeRevertReason(error.data); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(testCase.expectedErrName); + expect(String(parsed.args[0])).to.include(testCase.expectedErrReason); } - expect(decodedReason).contains(testCase.expectedReason); } }); it('should verify error data is properly hex-encoded in receipts', async function () { try { - const tx = await standardRevertTestContract.standardRevert("Hex encoding test", { gasLimit: DEFAULT_GAS_LIMIT }); + const tx = await standardRevertTestContract.standardRevert.staticCall("Hex encoding test", { gasLimit: DEFAULT_GAS_LIMIT }); await tx.wait(); expect.fail('Transaction should have reverted'); } catch (error) { - try { - const contractAddress = await standardRevertTestContract.getAddress(); - await hre.ethers.provider.call({ - to: contractAddress, - data: standardRevertTestContract.interface.encodeFunctionData('standardRevert', ['Hex encoding test']), - gasLimit: DEFAULT_GAS_LIMIT - }); - expect.fail('Call should have reverted'); - } catch (error) { - decodedReason = await decodeRevertReason(error.data); - } - expect(decodedReason).to.include('Hex encoding test'); + const parsed = parseEthersError(null, error.data); + expect(parsed.name).to.equal(ERROR_NAME); + expect(parsed.args[0]).to.include('Hex encoding test'); } }); }); diff --git a/tests/solidity/suites/revert_cases/test/test_helper.js b/tests/solidity/suites/revert_cases/test/test_helper.js index 258bb2ac3..1dd9c1c45 100644 --- a/tests/solidity/suites/revert_cases/test/test_helper.js +++ b/tests/solidity/suites/revert_cases/test/test_helper.js @@ -1,4 +1,5 @@ const { expect } = require('chai'); +const hre = require('hardhat'); // Helper to convert the raw tuple returned by staking.validator() into an object function parseValidator (raw) { @@ -75,6 +76,52 @@ function decodeRevertReason(errorData) { } } +/** + * Parse revert data into a structured error object when possible. + * + * - Standard revert string: Error(string) + * - Panic(uint256) + * - Common precompile custom errors (e.g. InvalidAddress, QueryFailed, MsgServerFailed) + * + * Returns: + * { name, args, signature, raw } or null + */ +function parseEthersError(iface, errorData) { + if (!errorData || errorData === '0x') { + throw new Error('missing revert data (e.data is empty)'); + } + + const raw = errorData; + const cleanHex = raw.startsWith('0x') ? raw : `0x${raw}`; + + // Standard revert formats handled by our string decoder. + const cleanNo0x = cleanHex.slice(2); + if (cleanNo0x.startsWith('08c379a0')) { + const reason = decodeRevertReason(cleanHex); + return { name: 'Error', args: [reason], signature: 'Error(string)', raw: cleanHex }; + } + if (cleanNo0x.startsWith('4e487b71')) { + // Panic(uint256) — decode the numeric code for direct comparison. + // Layout: selector(4) + uint256 code (32 bytes). + const codeHex = `0x${cleanNo0x.slice(8, 8 + 64)}`; + const code = Number(BigInt(codeHex)); + return { name: 'Panic', args: [code], signature: 'Panic(uint256)', raw: cleanHex }; + } + + try { + if (!iface) { + throw new Error('no interface provided for custom error decoding'); + } + const parsed = iface.parseError(cleanHex); + if (!parsed) { + throw new Error(`unable to decode error data: ${cleanHex}`); + } + return parsed; + } catch { + throw new Error(`unable to decode error data: ${cleanHex}`); + } +} + /** * Helper function to analyze transaction receipt for revert information */ @@ -114,16 +161,6 @@ async function analyzeFailedTransaction(txHash) { }; } -/** - * Helper function to verify decoded revert reason - */ -function verifyTransactionRevert(analysis, expectedRevertReason) { - expect(analysis).to.not.be.null; - expect(analysis.status).to.equal(0); // Failed transaction - expect(analysis.errorData).to.not.be.null; - expect(analysis.decodedReason).contains(expectedRevertReason, "unexpected revert reason"); -} - /** * Helper function to verify out of gas error */ @@ -137,8 +174,7 @@ function verifyOutOfGasError(analysis) { module.exports = { parseValidator, findEvent, - decodeRevertReason, + parseEthersError, analyzeFailedTransaction, - verifyTransactionRevert, verifyOutOfGasError } \ No newline at end of file diff --git a/testutil/ibc/chain.go b/testutil/ibc/chain.go index eb90c63a5..8863bc205 100644 --- a/testutil/ibc/chain.go +++ b/testutil/ibc/chain.go @@ -454,6 +454,10 @@ func (chain *TestChain) SendEvmTx( return txResult, nil, nil, err } if ethRes.VmError != "" { + // Preserve revert bytes on error so callers can do exact custom-error matching. + if len(ethRes.Ret) > 0 { + return txResult, msgEthereumTx, ethRes, errorsmod.Wrap(types.NewExecErrorWithReason(ethRes.Ret), "vm error: "+ethRes.VmError) + } return txResult, msgEthereumTx, ethRes, errorsmod.Wrapf(types.ErrVMExecution, "vm error: %s", ethRes.VmError) } diff --git a/testutil/integration/evm/factory/broadcast.go b/testutil/integration/evm/factory/broadcast.go index 88c6d05e8..c41495e4b 100644 --- a/testutil/integration/evm/factory/broadcast.go +++ b/testutil/integration/evm/factory/broadcast.go @@ -93,7 +93,16 @@ func (tf *IntegrationTxFactory) CallContractAndCheckLogs( if err != nil { // NOTE: here we are still passing the response to the log check function, // because we want to check the logs and expected error in case of a VM error. - return res, nil, CheckError(err, logCheckArgs) + checkErr := CheckError(err, logCheckArgs) + if checkErr != nil { + return res, nil, checkErr + } + // Expected VM error matched; still decode MsgEthereumTxResponse so callers can inspect Ret (revert bytes). + ethRes, decErr := evmtypes.DecodeTxResponse(res.Data) + if decErr != nil { + return res, nil, decErr + } + return res, ethRes, nil } ethRes, err := evmtypes.DecodeTxResponse(res.Data) diff --git a/testutil/integration/evm/factory/helpers.go b/testutil/integration/evm/factory/helpers.go index e03d21d2c..541d33138 100644 --- a/testutil/integration/evm/factory/helpers.go +++ b/testutil/integration/evm/factory/helpers.go @@ -1,10 +1,13 @@ package factory import ( + "bytes" + "errors" "strings" "github.com/ethereum/go-ethereum/common" + cmn "github.com/cosmos/evm/precompiles/common" "github.com/cosmos/evm/precompiles/testutil" evmtypes "github.com/cosmos/evm/x/vm/types" @@ -27,6 +30,33 @@ func CheckError(err error, logCheckArgs testutil.LogCheckArgs) error { return errorsmod.Wrap(err, "expected error but got none") case logCheckArgs.ExpPass && err != nil: return errorsmod.Wrap(err, "expected no error but got one") + case logCheckArgs.ErrExact != nil: + // When ErrExact is provided, validate revert bytes exactly (e.g. Solidity custom errors). + // This intentionally does not fall back to substring matching. + if err == nil { + return errorsmod.Wrap(err, "expected error but got none") + } + + var gotCarrier cmn.RevertDataCarrier + var wantCarrier cmn.RevertDataCarrier + if !errors.As(logCheckArgs.ErrExact, &wantCarrier) { + return errorsmod.Wrapf(err, "expected want error to implement RevertDataCarrier; want=%T", logCheckArgs.ErrExact) + } + + // The broadcast/tx execution path wraps errors (e.g. "failed ETH tx: ...") and often + // does not preserve a RevertDataCarrier on the returned error value. However, we still + // have the ABCI tx result available and can decode the raw EVM revert bytes from it. + if !errors.As(err, &gotCarrier) { + ethRes, decErr := evmtypes.DecodeTxResponse(logCheckArgs.Res.Data) + if decErr != nil { + return errorsmod.Wrapf(err, "expected errors to implement RevertDataCarrier; got=%T want=%T", err, logCheckArgs.ErrExact) + } + gotCarrier = evmtypes.NewExecErrorWithReason(ethRes.Ret) + } + if !bytes.Equal(gotCarrier.RevertData(), wantCarrier.RevertData()) { + return errorsmod.Wrapf(err, "expected revert data mismatch (got=%x want=%x)", gotCarrier.RevertData(), wantCarrier.RevertData()) + } + return nil case logCheckArgs.ErrContains == "": // NOTE: if err contains is empty, we return the error as it is return errorsmod.Wrap(err, "ErrContains needs to be filled") diff --git a/testutil/util.go b/testutil/util.go index fc5835ce4..8936b60f9 100644 --- a/testutil/util.go +++ b/testutil/util.go @@ -1,12 +1,10 @@ package testutil import ( - "bytes" "context" "fmt" "time" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/cosmos/evm/crypto/ethsecp256k1" @@ -122,10 +120,9 @@ func CreateTx(ctx context.Context, txCfg client.TxConfig, priv cryptotypes.PrivK // any ABI-encoded revert messages into readable error strings. // // Returns: -// - error: A formatted error containing either: -// - "tx failed with VmError: : " for successfully decoded reverts -// - "tx failed with VmError: : " for non-decodable data -// - "failed to decode revert data: " if decoding fails +// - error: Wraps evmtypes.NewExecErrorWithReason so standard Error(string) reverts surface +// in err.Error() (e.g. "execution reverted: insufficient allowance"), prefixed with VmError context. +// - "failed to decode revert data: " if hex validation fails // // Example usage: // @@ -137,18 +134,15 @@ func CreateTx(ctx context.Context, txCfg client.TxConfig, priv cryptotypes.PrivK func DecodeRevertReason(evmRes evmtypes.MsgEthereumTxResponse) error { revertErr := evmtypes.NewExecErrorWithReason(evmRes.Ret) hexData, ok := revertErr.ErrorData().(string) - if ok { - decodedBytes, err := hexutil.Decode(hexData) - if err == nil { - if len(decodedBytes) >= 4 && bytes.Equal(decodedBytes[:4], evmtypes.RevertSelector) { - var reason string - reason, err = abi.UnpackRevert(decodedBytes) - if err == nil { - return fmt.Errorf("tx failed with VmError: %v: %s", evmRes.VmError, reason) - } - } - } + if !ok { + return fmt.Errorf("tx failed with VmError: %v: %s", evmRes.VmError, revertErr.ErrorData()) + } + + if _, err := hexutil.Decode(hexData); err != nil { return errorsmod.Wrap(err, "failed to decode revert data") } + + // Wrap revertErr so Error(string) decodes (e.g. "out of gas", "insufficient funds") appear in + // err.Error() for integration test substring checks; hex remains on RevertError.ErrorData(). return fmt.Errorf("tx failed with VmError: %v: %s", evmRes.VmError, revertErr.ErrorData()) } diff --git a/x/erc20/keeper/testdata/Bytes32MetadataToken.json b/x/erc20/keeper/testdata/Bytes32MetadataToken.json index ef3f2bcb9..1421a77c8 100644 --- a/x/erc20/keeper/testdata/Bytes32MetadataToken.json +++ b/x/erc20/keeper/testdata/Bytes32MetadataToken.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "Bytes32MetadataToken", "sourceName": "solidity/x/erc20/keeper/testdata/Bytes32MetadataToken.sol", "abi": [ @@ -558,8 +558,11 @@ "type": "event" } ], - "bytecode": "0x6080604052601260075534801561001557600080fd5b50604051604080611af88339810180604052810190808051906020019092919080519060200190929190505050600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806000819055505033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a28160058160001916905550806006816000191690555050506119bd8061013b6000396000f30060806040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461014357806307da68f514610176578063095ea7b31461018d57806313af4035146101f257806318160ddd1461023557806323b872dd14610260578063313ce567146102e557806340c10f191461031057806342966c681461035d57806370a082311461038a57806375f12b21146103e15780637a9e5e4b146104105780638da5cb5b1461045357806395d89b41146104aa5780639dc29fac146104dd578063a0712d681461052a578063a9059cbb14610557578063b753a98c146105bc578063bb35783b14610609578063be9a655514610676578063bf7e214f1461068d578063daea85c5146106e4578063dd62ed3e1461073f578063f2d5d56b146107b6575b600080fd5b34801561014f57600080fd5b50610158610803565b60405180826000191660001916815260200191505060405180910390f35b34801561018257600080fd5b5061018b610809565b005b34801561019957600080fd5b506101d8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061090c565b604051808215151515815260200191505060405180910390f35b3480156101fe57600080fd5b50610233600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061093c565b005b34801561024157600080fd5b5061024a610a1e565b6040518082815260200191505060405180910390f35b34801561026c57600080fd5b506102cb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a27565b604051808215151515815260200191505060405180910390f35b3480156102f157600080fd5b506102fa610db1565b6040518082815260200191505060405180910390f35b34801561031c57600080fd5b5061035b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610db7565b005b34801561036957600080fd5b5061038860048036038101908080359060200190929190505050610efc565b005b34801561039657600080fd5b506103cb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f09565b6040518082815260200191505060405180910390f35b3480156103ed57600080fd5b506103f6610f52565b604051808215151515815260200191505060405180910390f35b34801561041c57600080fd5b50610451600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f65565b005b34801561045f57600080fd5b50610468611047565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104b657600080fd5b506104bf61106d565b60405180826000191660001916815260200191505060405180910390f35b3480156104e957600080fd5b50610528600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611073565b005b34801561053657600080fd5b506105556004803603810190808035906020019092919050505061139c565b005b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a9565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b50610607600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113be565b005b34801561061557600080fd5b50610674600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113ce565b005b34801561068257600080fd5b5061068b6113df565b005b34801561069957600080fd5b506106a26114e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106f057600080fd5b50610725600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611508565b604051808215151515815260200191505060405180910390f35b34801561074b57600080fd5b506107a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611557565b6040518082815260200191505060405180910390f35b3480156107c257600080fd5b50610801600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115de565b005b60055481565b610837336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561084257600080fd5b60008060043591506024359050806000191682600019163373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19163460003660405180848152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a46001600460146101000a81548160ff0219169083151502179055505050565b6000600460149054906101000a900460ff1615151561092a57600080fd5b6109348383611867565b905092915050565b61096a336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561097557600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a250565b60008054905090565b6000600460149054906101000a900460ff16151515610a4557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610b1d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610c2957610ba8600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611959565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610c72600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611959565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cfe600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611975565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60075481565b610de5336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b1515610df057600080fd5b600460149054906101000a900460ff16151515610e0c57600080fd5b610e55600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611975565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ea460005482611975565b6000819055508173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040518082815260200191505060405180910390a25050565b610f063382611073565b50565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600460149054906101000a900460ff1681565b610f93336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b1515610f9e57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada460405160405180910390a250565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b6110a1336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b15156110ac57600080fd5b600460149054906101000a900460ff161515156110c857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156111a057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156112ac5761122b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611959565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6112f5600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611959565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061134460005482611959565b6000819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a25050565b6113a63382610db7565b50565b60006113b6338484610a27565b905092915050565b6113c9338383610a27565b505050565b6113d9838383610a27565b50505050565b61140d336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561141857600080fd5b60008060043591506024359050806000191682600019163373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19163460003660405180848152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a46000600460146101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460149054906101000a900460ff1615151561152657600080fd5b611550827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611867565b9050919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6115e9823383610a27565b505050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561162d5760019050611861565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561168c5760019050611861565b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116ec5760009050611861565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b70096138430856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019350505050602060405180830381600087803b15801561182357600080fd5b505af1158015611837573d6000803e3d6000fd5b505050506040513d602081101561184d57600080fd5b810190808051906020019092919050505090505b92915050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000828284039150811115151561196f57600080fd5b92915050565b6000828284019150811015151561198b57600080fd5b929150505600a165627a7a723058204807a0c6598840a4406d9bb2cd7ed7aeae3f099b30d761b3112dffd43989d5760029", - "deployedBytecode": "0x60806040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461014357806307da68f514610176578063095ea7b31461018d57806313af4035146101f257806318160ddd1461023557806323b872dd14610260578063313ce567146102e557806340c10f191461031057806342966c681461035d57806370a082311461038a57806375f12b21146103e15780637a9e5e4b146104105780638da5cb5b1461045357806395d89b41146104aa5780639dc29fac146104dd578063a0712d681461052a578063a9059cbb14610557578063b753a98c146105bc578063bb35783b14610609578063be9a655514610676578063bf7e214f1461068d578063daea85c5146106e4578063dd62ed3e1461073f578063f2d5d56b146107b6575b600080fd5b34801561014f57600080fd5b50610158610803565b60405180826000191660001916815260200191505060405180910390f35b34801561018257600080fd5b5061018b610809565b005b34801561019957600080fd5b506101d8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061090c565b604051808215151515815260200191505060405180910390f35b3480156101fe57600080fd5b50610233600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061093c565b005b34801561024157600080fd5b5061024a610a1e565b6040518082815260200191505060405180910390f35b34801561026c57600080fd5b506102cb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a27565b604051808215151515815260200191505060405180910390f35b3480156102f157600080fd5b506102fa610db1565b6040518082815260200191505060405180910390f35b34801561031c57600080fd5b5061035b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610db7565b005b34801561036957600080fd5b5061038860048036038101908080359060200190929190505050610efc565b005b34801561039657600080fd5b506103cb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f09565b6040518082815260200191505060405180910390f35b3480156103ed57600080fd5b506103f6610f52565b604051808215151515815260200191505060405180910390f35b34801561041c57600080fd5b50610451600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f65565b005b34801561045f57600080fd5b50610468611047565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104b657600080fd5b506104bf61106d565b60405180826000191660001916815260200191505060405180910390f35b3480156104e957600080fd5b50610528600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611073565b005b34801561053657600080fd5b506105556004803603810190808035906020019092919050505061139c565b005b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a9565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b50610607600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113be565b005b34801561061557600080fd5b50610674600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113ce565b005b34801561068257600080fd5b5061068b6113df565b005b34801561069957600080fd5b506106a26114e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106f057600080fd5b50610725600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611508565b604051808215151515815260200191505060405180910390f35b34801561074b57600080fd5b506107a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611557565b6040518082815260200191505060405180910390f35b3480156107c257600080fd5b50610801600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115de565b005b60055481565b610837336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561084257600080fd5b60008060043591506024359050806000191682600019163373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19163460003660405180848152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a46001600460146101000a81548160ff0219169083151502179055505050565b6000600460149054906101000a900460ff1615151561092a57600080fd5b6109348383611867565b905092915050565b61096a336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561097557600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a250565b60008054905090565b6000600460149054906101000a900460ff16151515610a4557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610b1d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610c2957610ba8600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611959565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610c72600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611959565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cfe600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611975565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60075481565b610de5336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b1515610df057600080fd5b600460149054906101000a900460ff16151515610e0c57600080fd5b610e55600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611975565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ea460005482611975565b6000819055508173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040518082815260200191505060405180910390a25050565b610f063382611073565b50565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600460149054906101000a900460ff1681565b610f93336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b1515610f9e57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada460405160405180910390a250565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b6110a1336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b15156110ac57600080fd5b600460149054906101000a900460ff161515156110c857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156111a057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156112ac5761122b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611959565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6112f5600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611959565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061134460005482611959565b6000819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a25050565b6113a63382610db7565b50565b60006113b6338484610a27565b905092915050565b6113c9338383610a27565b505050565b6113d9838383610a27565b50505050565b61140d336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561141857600080fd5b60008060043591506024359050806000191682600019163373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19163460003660405180848152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a46000600460146101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460149054906101000a900460ff1615151561152657600080fd5b611550827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611867565b9050919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6115e9823383610a27565b505050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561162d5760019050611861565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561168c5760019050611861565b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116ec5760009050611861565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b70096138430856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019350505050602060405180830381600087803b15801561182357600080fd5b505af1158015611837573d6000803e3d6000fd5b505050506040513d602081101561184d57600080fd5b810190808051906020019092919050505090505b92915050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000828284039150811115151561196f57600080fd5b92915050565b6000828284019150811015151561198b57600080fd5b929150505600a165627a7a723058204807a0c6598840a4406d9bb2cd7ed7aeae3f099b30d761b3112dffd43989d5760029", + "bytecode": "0x6080604052601260075534801561001557600080fd5b50604051604080611af88339810180604052810190808051906020019092919080519060200190929190505050600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806000819055505033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a28160058160001916905550806006816000191690555050506119bd8061013b6000396000f30060806040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461014357806307da68f514610176578063095ea7b31461018d57806313af4035146101f257806318160ddd1461023557806323b872dd14610260578063313ce567146102e557806340c10f191461031057806342966c681461035d57806370a082311461038a57806375f12b21146103e15780637a9e5e4b146104105780638da5cb5b1461045357806395d89b41146104aa5780639dc29fac146104dd578063a0712d681461052a578063a9059cbb14610557578063b753a98c146105bc578063bb35783b14610609578063be9a655514610676578063bf7e214f1461068d578063daea85c5146106e4578063dd62ed3e1461073f578063f2d5d56b146107b6575b600080fd5b34801561014f57600080fd5b50610158610803565b60405180826000191660001916815260200191505060405180910390f35b34801561018257600080fd5b5061018b610809565b005b34801561019957600080fd5b506101d8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061090c565b604051808215151515815260200191505060405180910390f35b3480156101fe57600080fd5b50610233600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061093c565b005b34801561024157600080fd5b5061024a610a1e565b6040518082815260200191505060405180910390f35b34801561026c57600080fd5b506102cb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a27565b604051808215151515815260200191505060405180910390f35b3480156102f157600080fd5b506102fa610db1565b6040518082815260200191505060405180910390f35b34801561031c57600080fd5b5061035b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610db7565b005b34801561036957600080fd5b5061038860048036038101908080359060200190929190505050610efc565b005b34801561039657600080fd5b506103cb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f09565b6040518082815260200191505060405180910390f35b3480156103ed57600080fd5b506103f6610f52565b604051808215151515815260200191505060405180910390f35b34801561041c57600080fd5b50610451600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f65565b005b34801561045f57600080fd5b50610468611047565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104b657600080fd5b506104bf61106d565b60405180826000191660001916815260200191505060405180910390f35b3480156104e957600080fd5b50610528600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611073565b005b34801561053657600080fd5b506105556004803603810190808035906020019092919050505061139c565b005b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a9565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b50610607600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113be565b005b34801561061557600080fd5b50610674600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113ce565b005b34801561068257600080fd5b5061068b6113df565b005b34801561069957600080fd5b506106a26114e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106f057600080fd5b50610725600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611508565b604051808215151515815260200191505060405180910390f35b34801561074b57600080fd5b506107a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611557565b6040518082815260200191505060405180910390f35b3480156107c257600080fd5b50610801600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115de565b005b60055481565b610837336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561084257600080fd5b60008060043591506024359050806000191682600019163373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19163460003660405180848152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a46001600460146101000a81548160ff0219169083151502179055505050565b6000600460149054906101000a900460ff1615151561092a57600080fd5b6109348383611867565b905092915050565b61096a336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561097557600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a250565b60008054905090565b6000600460149054906101000a900460ff16151515610a4557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610b1d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610c2957610ba8600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611959565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610c72600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611959565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cfe600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611975565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60075481565b610de5336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b1515610df057600080fd5b600460149054906101000a900460ff16151515610e0c57600080fd5b610e55600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611975565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ea460005482611975565b6000819055508173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040518082815260200191505060405180910390a25050565b610f063382611073565b50565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600460149054906101000a900460ff1681565b610f93336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b1515610f9e57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada460405160405180910390a250565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b6110a1336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b15156110ac57600080fd5b600460149054906101000a900460ff161515156110c857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156111a057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156112ac5761122b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611959565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6112f5600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611959565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061134460005482611959565b6000819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a25050565b6113a63382610db7565b50565b60006113b6338484610a27565b905092915050565b6113c9338383610a27565b505050565b6113d9838383610a27565b50505050565b61140d336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561141857600080fd5b60008060043591506024359050806000191682600019163373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19163460003660405180848152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a46000600460146101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460149054906101000a900460ff1615151561152657600080fd5b611550827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611867565b9050919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6115e9823383610a27565b505050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561162d5760019050611861565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561168c5760019050611861565b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116ec5760009050611861565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b70096138430856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019350505050602060405180830381600087803b15801561182357600080fd5b505af1158015611837573d6000803e3d6000fd5b505050506040513d602081101561184d57600080fd5b810190808051906020019092919050505090505b92915050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000828284039150811115151561196f57600080fd5b92915050565b6000828284019150811015151561198b57600080fd5b929150505600a165627a7a7230582018ae1658de4cee7c6655c5cc44e6f129c36236905f3ed749fa248ab484dc51570029", + "deployedBytecode": "0x60806040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461014357806307da68f514610176578063095ea7b31461018d57806313af4035146101f257806318160ddd1461023557806323b872dd14610260578063313ce567146102e557806340c10f191461031057806342966c681461035d57806370a082311461038a57806375f12b21146103e15780637a9e5e4b146104105780638da5cb5b1461045357806395d89b41146104aa5780639dc29fac146104dd578063a0712d681461052a578063a9059cbb14610557578063b753a98c146105bc578063bb35783b14610609578063be9a655514610676578063bf7e214f1461068d578063daea85c5146106e4578063dd62ed3e1461073f578063f2d5d56b146107b6575b600080fd5b34801561014f57600080fd5b50610158610803565b60405180826000191660001916815260200191505060405180910390f35b34801561018257600080fd5b5061018b610809565b005b34801561019957600080fd5b506101d8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061090c565b604051808215151515815260200191505060405180910390f35b3480156101fe57600080fd5b50610233600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061093c565b005b34801561024157600080fd5b5061024a610a1e565b6040518082815260200191505060405180910390f35b34801561026c57600080fd5b506102cb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a27565b604051808215151515815260200191505060405180910390f35b3480156102f157600080fd5b506102fa610db1565b6040518082815260200191505060405180910390f35b34801561031c57600080fd5b5061035b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610db7565b005b34801561036957600080fd5b5061038860048036038101908080359060200190929190505050610efc565b005b34801561039657600080fd5b506103cb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f09565b6040518082815260200191505060405180910390f35b3480156103ed57600080fd5b506103f6610f52565b604051808215151515815260200191505060405180910390f35b34801561041c57600080fd5b50610451600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f65565b005b34801561045f57600080fd5b50610468611047565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104b657600080fd5b506104bf61106d565b60405180826000191660001916815260200191505060405180910390f35b3480156104e957600080fd5b50610528600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611073565b005b34801561053657600080fd5b506105556004803603810190808035906020019092919050505061139c565b005b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a9565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b50610607600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113be565b005b34801561061557600080fd5b50610674600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113ce565b005b34801561068257600080fd5b5061068b6113df565b005b34801561069957600080fd5b506106a26114e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106f057600080fd5b50610725600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611508565b604051808215151515815260200191505060405180910390f35b34801561074b57600080fd5b506107a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611557565b6040518082815260200191505060405180910390f35b3480156107c257600080fd5b50610801600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115de565b005b60055481565b610837336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561084257600080fd5b60008060043591506024359050806000191682600019163373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19163460003660405180848152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a46001600460146101000a81548160ff0219169083151502179055505050565b6000600460149054906101000a900460ff1615151561092a57600080fd5b6109348383611867565b905092915050565b61096a336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561097557600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a250565b60008054905090565b6000600460149054906101000a900460ff16151515610a4557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610b1d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610c2957610ba8600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611959565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610c72600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611959565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cfe600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611975565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60075481565b610de5336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b1515610df057600080fd5b600460149054906101000a900460ff16151515610e0c57600080fd5b610e55600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611975565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ea460005482611975565b6000819055508173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040518082815260200191505060405180910390a25050565b610f063382611073565b50565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600460149054906101000a900460ff1681565b610f93336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b1515610f9e57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada460405160405180910390a250565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b6110a1336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b15156110ac57600080fd5b600460149054906101000a900460ff161515156110c857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156111a057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156112ac5761122b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611959565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6112f5600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611959565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061134460005482611959565b6000819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a25050565b6113a63382610db7565b50565b60006113b6338484610a27565b905092915050565b6113c9338383610a27565b505050565b6113d9838383610a27565b50505050565b61140d336000357fffffffff00000000000000000000000000000000000000000000000000000000166115ee565b151561141857600080fd5b60008060043591506024359050806000191682600019163373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19163460003660405180848152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a46000600460146101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460149054906101000a900460ff1615151561152657600080fd5b611550827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611867565b9050919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6115e9823383610a27565b505050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561162d5760019050611861565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561168c5760019050611861565b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116ec5760009050611861565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b70096138430856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019350505050602060405180830381600087803b15801561182357600080fd5b505af1158015611837573d6000803e3d6000fd5b505050506040513d602081101561184d57600080fd5b810190808051906020019092919050505090505b92915050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000828284039150811115151561196f57600080fd5b92915050565b6000828284019150811015151561198b57600080fd5b929150505600a165627a7a7230582018ae1658de4cee7c6655c5cc44e6f129c36236905f3ed749fa248ab484dc51570029", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/x/erc20/keeper/testdata/Bytes32MetadataToken.sol", + "buildInfoId": "solc-0_4_22-c2ca4723fc9f314f95b3b254c471e2775e030459" +} \ No newline at end of file diff --git a/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json b/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json index e0ebe7dd3..d6ca2410f 100644 --- a/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json +++ b/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "ERC20DirectBalanceManipulation", "sourceName": "solidity/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol", "abi": [ @@ -14,6 +14,123 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -237,7 +354,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -275,7 +392,7 @@ "inputs": [ { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -293,7 +410,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -315,30 +432,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -358,49 +451,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -443,30 +493,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -527,7 +553,7 @@ }, { "internalType": "address", - "name": "account", + "name": "callerConfirmation", "type": "address" } ], @@ -637,7 +663,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -660,8 +686,11 @@ "type": "function" } ], - "bytecode": "0x6080346200064f57601f62001f3738819003828101601f199081168501946001600160401b039490939092858711858810176200056a57808592604098895283396020948591810103126200064f5751936200005a62000654565b916200006562000654565b908351918383116200056a5760059283546001968782811c9216801562000644575b8a83101462000549578189849311620005f0575b5089908983116001146200058c5760009262000580575b5050600019600383901b1c191690861b1783555b80519384116200056a576006548581811c911680156200055f575b8882101462000549578493878211620004f0575b505086918684116001146200048957506000926200047d575b5050600019600383901b1c191690821b176006555b60ff19806007541660075560008052600084528560002033600052845260ff8660002054161562000442575b600080528184526200016533876000206200069e565b507f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a680600052600085528660002033600052855260ff8760002054161562000407575b600052818452620001bd33876000206200069e565b507f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a80600052600085528660002033600052855260ff87600020541615620003cc575b6000528184526200021533876000206200069e565b5060078054610100600160a81b031916744dc6ac40af078661fc43823086e1513635eeab1400179055600080805280855286812033825285528690205460ff161562000390575b506000805282526200027233856000206200069e565b5033156200034e575060ff60075416620002f857600454828101809111620002e2576000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916004553383526002815284832084815401905584519384523393a3516117eb90816200072c8239f35b634e487b7160e01b600052601160045260246000fd5b60849083519062461bcd60e51b82526004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152fd5b6064925083519162461bcd60e51b8352600483015260248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b6000805260008452856000203360005284528186600020918254161790553333600060008051602062001f178339815191528180a4386200025c565b80600052600085528660002033600052855286600020838382541617905533338260008051602062001f17833981519152600080a462000200565b80600052600085528660002033600052855286600020838382541617905533338260008051602062001f17833981519152600080a4620001a8565b6000805260008452856000203360005284528560002082828254161790553333600060008051602062001f178339815191528180a46200014f565b0151905038806200010e565b859492919216916006600052876000209260005b89828210620004d95750508411620004bf575b505050811b0160065562000123565b015160001960f88460031b161c19169055388080620004b0565b83850151865588979095019493840193016200049d565b90919293506006600052876000209087808701821c8301938a88106200053f575b91879695949391899301901c01915b8281106200052f5750620000f5565b6000815586955087910162000520565b9350829362000511565b634e487b7160e01b600052602260045260246000fd5b90607f1690620000e1565b634e487b7160e01b600052604160045260246000fd5b015190503880620000b2565b908589941691876000528b6000209260005b8d828210620005d95750508411620005bf575b505050811b018355620000c6565b015160001960f88460031b161c19169055388080620005b1565b8385015186558c979095019493840193016200059e565b909150856000528960002089808501881c8201928c86106200063a575b918a918695949301891c01915b8281106200062a5750506200009b565b600081558594508a91016200061a565b925081926200060d565b91607f169162000087565b600080fd5b60408051919082016001600160401b038111838210176200056a57604052601e82527f455243323044697265637442616c616e63654d616e6970756c6174696f6e00006020830152565b91906001830160009082825280602052604082205415600014620007255784549468010000000000000000861015620007115760018601808255861015620006fd57836040949596828552602085200155549382526020522055600190565b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b83526041600452602483fd5b5092505056fe608060408181526004918236101561001657600080fd5b600092833560e01c91826301ffc9a714610c615750816306fdde0314610bc0578163095ea7b314610b9657816318160ddd14610b7857816323b872dd14610b3b578163248a9ca314610b115781632f2ff15d14610a5d578163313ce56714610a4157816336568abe146109af578163395093511461095f5781633f4ba83a1461085557816340c10f19146106c057816342966c68146106a25781635c975abb1461067e57816370a082311461064657816379cc6790146106165781638456cb59146105105781639010d07c146104cf57816391d148541461048957816395d89b41146103a4578163a217fddf14610389578163a457c2d7146102e4578163a9059cbb14610271578163ca15c87314610249578163d53913931461020e578163d547741f146101cc57508063dd62ed3e146101845763e63ab1e91461015957600080fd5b34610180578160031936011261018057602090516000805160206117768339815191528152f35b5080fd5b5034610180578060031936011261018057806020926101a1610d1d565b6101a9610d38565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b9190503461020a578060031936011261020a57610207913561020260016101f1610d38565b938387528660205286200154610d4e565b6110ae565b80f35b8280fd5b505034610180578160031936011261018057602090517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b90503461020a57602036600319011261020a5760209282913581526001845220549051908152f35b8284346102e157816003193601126102e15761028b610d1d565b600754602435600181901c938482039260081c6001600160a01b03169183116102ce576020866102c787876102c1888833611158565b33611158565b5160018152f35b634e487b7160e01b815260118752602490fd5b80fd5b905082346102e157826003193601126102e1576102ff610d1d565b918360243592338152600360205281812060018060a01b0386168252602052205490828210610338576020856102c78585038733611318565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b50503461018057816003193601126101805751908152602090f35b9190503461020a578260031936011261020a57805191836006549060019082821c92828116801561047f575b602095868610821461046c575084885290811561044a575060011461040f575b61040b8686610401828b0383611076565b5191829182610cf1565b0390f35b929550600683528583205b828410610437575050508261040b946104019282010194386103f0565b805486850188015292860192810161041a565b60ff191687860152505050151560051b83010192506104018261040b386103f0565b634e487b7160e01b845260229052602483fd5b93607f16936103d0565b90503461020a578160031936011261020a578160209360ff926104aa610d38565b903582528186528282206001600160a01b039091168252855220549151911615158152f35b90503461020a578160031936011261020a576020926104fa91358152600184528260243591206115dc565b905491519160018060a01b039160031b1c168152f35b90503461020a578260031936011261020a5760008051602061177683398151915283528260205281832033845260205260ff8284205416156105c6576007549060ff8216610590575060ff1916600117600755513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a180f35b606490602084519162461bcd60e51b8352820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152fd5b6020608492519162461bcd60e51b83528201526037602482015260008051602061175683398151915260448201527676652070617573657220726f6c6520746f20706175736560481b6064820152fd5b505034610180573660031901126102e157610207610632610d1d565b6024359061064182338361141a565b6114b2565b5050346101805760203660031901126101805760209181906001600160a01b0361066e610d1d565b1681526002845220549051908152f35b50503461018057816003193601126101805760209060ff6007541690519015158152f35b839034610180576020366003190112610180576102079035336114b2565b9190503461020a578060031936011261020a576106db610d1d565b90602435907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68552602092858452818620338752845260ff828720541615610805576001600160a01b03169384156107c45760ff60075416610770579185939183610756836000805160206117968339815191529654611135565b90558585526002835280852082815401905551908152a380f35b83608492519162461bcd60e51b8352820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152fd5b83606492519162461bcd60e51b8352820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b815162461bcd60e51b8152808601859052603660248201526000805160206117568339815191526044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b6064820152608490fd5b90503461020a578260031936011261020a5760008051602061177683398151915283528260205281832033845260205260ff82842054161561090d576007549060ff8216156108d3575060ff1916600755513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b6020608492519162461bcd60e51b83528201526039602482015260008051602061175683398151915260448201527876652070617573657220726f6c6520746f20756e706175736560381b6064820152fd5b5050346101805780600319360112610180576102c76020926109a8610982610d1d565b338352600386528483206001600160a01b03821684528652918490205460243590611135565b9033611318565b839150346101805782600319360112610180576109ca610d38565b90336001600160a01b038316036109e6579061020791356110ae565b608490602085519162461bcd60e51b8352820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152fd5b5050346101805781600319360112610180576020905160128152f35b9190503461020a578060031936011261020a57610ac69135906001610a80610d38565b92808652602090868252610a98838589200154610d4e565b80875286825283872094838060a01b031694858852825260ff848820541615610aca575b86525283206115f4565b5080f35b8087528682528387208588528252838720805460ff1916841790553385827f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8a80a4610abc565b90503461020a57602036600319011261020a57816020936001923581528085522001549051908152f35b505034610180576060366003190112610180576020906102c7610b5c610d1d565b610b64610d38565b60443591610b7383338361141a565b611158565b90503461020a578260031936011261020a5760209250549051908152f35b5050346101805780600319360112610180576020906102c7610bb6610d1d565b6024359033611318565b9190503461020a578260031936011261020a57805191836005549060019082821c928281168015610c57575b602095868610821461046c575084885290811561044a5750600114610c1c5761040b8686610401828b0383611076565b929550600583528583205b828410610c44575050508261040b946104019282010194386103f0565b8054868501880152928601928101610c27565b93607f1693610bec565b84913461020a57602036600319011261020a573563ffffffff60e01b811680910361020a5760209250635a05180f60e01b8114908115610ca3575b5015158152f35b637965db0b60e01b811491508115610cbd575b5083610c9c565b6301ffc9a760e01b14905083610cb6565b60005b838110610ce15750506000910152565b8181015183820152602001610cd1565b60409160208252610d118151809281602086015260208686019101610cce565b601f01601f1916010190565b600435906001600160a01b0382168203610d3357565b600080fd5b602435906001600160a01b0382168203610d3357565b6000818152602090808252604092838220338352835260ff848320541615610d765750505050565b835167ffffffffffffffff9190336060820184811183821017611062578752602a8252858201928736853782511561104e576030845382519160019283101561103a576078602185015360295b838111610fd05750610f8e5790875194608086019086821090821117610f7a57885260428552868501956060368837855115610f6657603087538551821015610f665790607860218701536041915b818311610ef857505050610eb657938593610e9c93610e8d604894610e6476020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b99610eb29b519a8b978801525180926037880190610cce565b8401917001034b99036b4b9b9b4b733903937b6329607d1b603784015251809386840190610cce565b01036028810185520183611076565b5162461bcd60e51b815291829160048301610cf1565b0390fd5b60648587519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f81166010811015610f52576f181899199a1a9b1b9c1cb0b131b232b360811b901a610f2885896115b5565b5360041c928015610f3e57600019019190610e12565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b87526041600452602487fd5b60648789519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b90600f81166010811015611026576f181899199a1a9b1b9c1cb0b131b232b360811b901a610ffe83876115b5565b5360041c9080156110125760001901610dc3565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b87526032600452602487fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b86526041600452602486fd5b90601f8019910116810190811067ffffffffffffffff82111761109857604052565b634e487b7160e01b600052604160045260246000fd5b9060406110eb92600090808252816020528282209360018060a01b03169384835260205260ff83832054166110ee575b8152600160205220611679565b50565b8082528160205282822084835260205282822060ff1981541690553384827ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8580a46110de565b9190820180921161114257565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b039081169182156112c557169182156112745760ff6007541661121c57600082815260026020526040812054918083106111c8576040828260008051602061179683398151915295876020965260028652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6001600160a01b039081169182156113c957169182156113795760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260038252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b9060018060a01b0380831660005260036020526040600020908216600052602052604060002054926000198403611452575b50505050565b80841061146d57611464930391611318565b3880808061144c565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b6001600160a01b031680156115665760ff6007541661121c57806000526002602052604060002054918083106115165760208160008051602061179683398151915292600095858752600284520360408620558060045403600455604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b9081518110156115c6570160200190565b634e487b7160e01b600052603260045260246000fd5b80548210156115c65760005260206000200190600090565b9190600183016000908282528060205260408220541560001461167357845494600160401b86101561165f578361164f611638886001604098999a018555846115dc565b819391549060031b91821b91600019901b19161790565b9055549382526020522055600190565b634e487b7160e01b83526041600452602483fd5b50925050565b9060018201906000928184528260205260408420549081151560001461174e576000199180830181811161173a5782549084820191821161101257808203611705575b505050805480156116f1578201916116d483836115dc565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b61172561171561163893866115dc565b90549060031b1c928392866115dc565b905586528460205260408620553880806116bc565b634e487b7160e01b87526011600452602487fd5b505050509056fe45524332305072657365744d696e7465725061757365723a206d75737420686165d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220487a5706488fe467f28c39bcfc12e0aef2533a87fec1d9e291529501d9b86f3964736f6c634300081400332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", - "deployedBytecode": "0x608060408181526004918236101561001657600080fd5b600092833560e01c91826301ffc9a714610c615750816306fdde0314610bc0578163095ea7b314610b9657816318160ddd14610b7857816323b872dd14610b3b578163248a9ca314610b115781632f2ff15d14610a5d578163313ce56714610a4157816336568abe146109af578163395093511461095f5781633f4ba83a1461085557816340c10f19146106c057816342966c68146106a25781635c975abb1461067e57816370a082311461064657816379cc6790146106165781638456cb59146105105781639010d07c146104cf57816391d148541461048957816395d89b41146103a4578163a217fddf14610389578163a457c2d7146102e4578163a9059cbb14610271578163ca15c87314610249578163d53913931461020e578163d547741f146101cc57508063dd62ed3e146101845763e63ab1e91461015957600080fd5b34610180578160031936011261018057602090516000805160206117768339815191528152f35b5080fd5b5034610180578060031936011261018057806020926101a1610d1d565b6101a9610d38565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b9190503461020a578060031936011261020a57610207913561020260016101f1610d38565b938387528660205286200154610d4e565b6110ae565b80f35b8280fd5b505034610180578160031936011261018057602090517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b90503461020a57602036600319011261020a5760209282913581526001845220549051908152f35b8284346102e157816003193601126102e15761028b610d1d565b600754602435600181901c938482039260081c6001600160a01b03169183116102ce576020866102c787876102c1888833611158565b33611158565b5160018152f35b634e487b7160e01b815260118752602490fd5b80fd5b905082346102e157826003193601126102e1576102ff610d1d565b918360243592338152600360205281812060018060a01b0386168252602052205490828210610338576020856102c78585038733611318565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b50503461018057816003193601126101805751908152602090f35b9190503461020a578260031936011261020a57805191836006549060019082821c92828116801561047f575b602095868610821461046c575084885290811561044a575060011461040f575b61040b8686610401828b0383611076565b5191829182610cf1565b0390f35b929550600683528583205b828410610437575050508261040b946104019282010194386103f0565b805486850188015292860192810161041a565b60ff191687860152505050151560051b83010192506104018261040b386103f0565b634e487b7160e01b845260229052602483fd5b93607f16936103d0565b90503461020a578160031936011261020a578160209360ff926104aa610d38565b903582528186528282206001600160a01b039091168252855220549151911615158152f35b90503461020a578160031936011261020a576020926104fa91358152600184528260243591206115dc565b905491519160018060a01b039160031b1c168152f35b90503461020a578260031936011261020a5760008051602061177683398151915283528260205281832033845260205260ff8284205416156105c6576007549060ff8216610590575060ff1916600117600755513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a180f35b606490602084519162461bcd60e51b8352820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152fd5b6020608492519162461bcd60e51b83528201526037602482015260008051602061175683398151915260448201527676652070617573657220726f6c6520746f20706175736560481b6064820152fd5b505034610180573660031901126102e157610207610632610d1d565b6024359061064182338361141a565b6114b2565b5050346101805760203660031901126101805760209181906001600160a01b0361066e610d1d565b1681526002845220549051908152f35b50503461018057816003193601126101805760209060ff6007541690519015158152f35b839034610180576020366003190112610180576102079035336114b2565b9190503461020a578060031936011261020a576106db610d1d565b90602435907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68552602092858452818620338752845260ff828720541615610805576001600160a01b03169384156107c45760ff60075416610770579185939183610756836000805160206117968339815191529654611135565b90558585526002835280852082815401905551908152a380f35b83608492519162461bcd60e51b8352820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152fd5b83606492519162461bcd60e51b8352820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b815162461bcd60e51b8152808601859052603660248201526000805160206117568339815191526044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b6064820152608490fd5b90503461020a578260031936011261020a5760008051602061177683398151915283528260205281832033845260205260ff82842054161561090d576007549060ff8216156108d3575060ff1916600755513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b6020608492519162461bcd60e51b83528201526039602482015260008051602061175683398151915260448201527876652070617573657220726f6c6520746f20756e706175736560381b6064820152fd5b5050346101805780600319360112610180576102c76020926109a8610982610d1d565b338352600386528483206001600160a01b03821684528652918490205460243590611135565b9033611318565b839150346101805782600319360112610180576109ca610d38565b90336001600160a01b038316036109e6579061020791356110ae565b608490602085519162461bcd60e51b8352820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152fd5b5050346101805781600319360112610180576020905160128152f35b9190503461020a578060031936011261020a57610ac69135906001610a80610d38565b92808652602090868252610a98838589200154610d4e565b80875286825283872094838060a01b031694858852825260ff848820541615610aca575b86525283206115f4565b5080f35b8087528682528387208588528252838720805460ff1916841790553385827f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8a80a4610abc565b90503461020a57602036600319011261020a57816020936001923581528085522001549051908152f35b505034610180576060366003190112610180576020906102c7610b5c610d1d565b610b64610d38565b60443591610b7383338361141a565b611158565b90503461020a578260031936011261020a5760209250549051908152f35b5050346101805780600319360112610180576020906102c7610bb6610d1d565b6024359033611318565b9190503461020a578260031936011261020a57805191836005549060019082821c928281168015610c57575b602095868610821461046c575084885290811561044a5750600114610c1c5761040b8686610401828b0383611076565b929550600583528583205b828410610c44575050508261040b946104019282010194386103f0565b8054868501880152928601928101610c27565b93607f1693610bec565b84913461020a57602036600319011261020a573563ffffffff60e01b811680910361020a5760209250635a05180f60e01b8114908115610ca3575b5015158152f35b637965db0b60e01b811491508115610cbd575b5083610c9c565b6301ffc9a760e01b14905083610cb6565b60005b838110610ce15750506000910152565b8181015183820152602001610cd1565b60409160208252610d118151809281602086015260208686019101610cce565b601f01601f1916010190565b600435906001600160a01b0382168203610d3357565b600080fd5b602435906001600160a01b0382168203610d3357565b6000818152602090808252604092838220338352835260ff848320541615610d765750505050565b835167ffffffffffffffff9190336060820184811183821017611062578752602a8252858201928736853782511561104e576030845382519160019283101561103a576078602185015360295b838111610fd05750610f8e5790875194608086019086821090821117610f7a57885260428552868501956060368837855115610f6657603087538551821015610f665790607860218701536041915b818311610ef857505050610eb657938593610e9c93610e8d604894610e6476020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b99610eb29b519a8b978801525180926037880190610cce565b8401917001034b99036b4b9b9b4b733903937b6329607d1b603784015251809386840190610cce565b01036028810185520183611076565b5162461bcd60e51b815291829160048301610cf1565b0390fd5b60648587519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f81166010811015610f52576f181899199a1a9b1b9c1cb0b131b232b360811b901a610f2885896115b5565b5360041c928015610f3e57600019019190610e12565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b87526041600452602487fd5b60648789519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b90600f81166010811015611026576f181899199a1a9b1b9c1cb0b131b232b360811b901a610ffe83876115b5565b5360041c9080156110125760001901610dc3565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b87526032600452602487fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b86526041600452602486fd5b90601f8019910116810190811067ffffffffffffffff82111761109857604052565b634e487b7160e01b600052604160045260246000fd5b9060406110eb92600090808252816020528282209360018060a01b03169384835260205260ff83832054166110ee575b8152600160205220611679565b50565b8082528160205282822084835260205282822060ff1981541690553384827ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8580a46110de565b9190820180921161114257565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b039081169182156112c557169182156112745760ff6007541661121c57600082815260026020526040812054918083106111c8576040828260008051602061179683398151915295876020965260028652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6001600160a01b039081169182156113c957169182156113795760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260038252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b9060018060a01b0380831660005260036020526040600020908216600052602052604060002054926000198403611452575b50505050565b80841061146d57611464930391611318565b3880808061144c565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b6001600160a01b031680156115665760ff6007541661121c57806000526002602052604060002054918083106115165760208160008051602061179683398151915292600095858752600284520360408620558060045403600455604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b9081518110156115c6570160200190565b634e487b7160e01b600052603260045260246000fd5b80548210156115c65760005260206000200190600090565b9190600183016000908282528060205260408220541560001461167357845494600160401b86101561165f578361164f611638886001604098999a018555846115dc565b819391549060031b91821b91600019901b19161790565b9055549382526020522055600190565b634e487b7160e01b83526041600452602483fd5b50925050565b9060018201906000928184528260205260408420549081151560001461174e576000199180830181811161173a5782549084820191821161101257808203611705575b505050805480156116f1578201916116d483836115dc565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b61172561171561163893866115dc565b90549060031b1c928392866115dc565b905586528460205260408620553880806116bc565b634e487b7160e01b87526011600452602487fd5b505050509056fe45524332305072657365744d696e7465725061757365723a206d75737420686165d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220487a5706488fe467f28c39bcfc12e0aef2533a87fec1d9e291529501d9b86f3964736f6c63430008140033", + "bytecode": "0x6080604052346103df57604051601f6113ef38819003918201601f19168301916001600160401b038311848410176102f0578084926020946040528339810103126103df575161004d6103e3565b906100566103e3565b82519091906001600160401b0381116102f057600354600181811c911680156103d5575b60208210146102d257601f8111610372575b506020601f821160011461030f57819293945f92610304575b50508160011b915f199060031b1c1916176003555b81516001600160401b0381116102f057600454600181811c911680156102e6575b60208210146102d257601f811161026f575b50602092601f821160011461020e57928192935f92610203575b50508160011b915f199060031b1c1916176004555b600780546001600160a01b031916734dc6ac40af078661fc43823086e1513635eeab1417905561014b3361042c565b50610155336104a2565b5061015f3361055b565b5033156101f05760ff600554166101e1576002548181018091116101cd57600255335f525f60205260405f208181540190556040519081525f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a3604051610da090816105ef8239f35b634e487b7160e01b5f52601160045260245ffd5b63d93c066560e01b5f5260045ffd5b63ec442f0560e01b5f525f60045260245ffd5b015190505f80610107565b601f1982169360045f52805f20915f5b868110610257575083600195961061023f575b505050811b0160045561011c565b01515f1960f88460031b161c191690555f8080610231565b9192602060018192868501518155019401920161021e565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106102c8575b601f0160051c01905b8181106102bd57506100ed565b5f81556001016102b0565b90915081906102a7565b634e487b7160e01b5f52602260045260245ffd5b90607f16906100db565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100a5565b601f1982169060035f52805f20915f5b81811061035a57509583600195969710610342575b505050811b016003556100ba565b01515f1960f88460031b161c191690555f8080610334565b9192602060018192868b01518155019401920161031f565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106103cb575b601f0160051c01905b8181106103c0575061008c565b5f81556001016103b3565b90915081906103aa565b90607f169061007a565b5f80fd5b60408051919082016001600160401b038111838210176102f057604052601e82527f455243323044697265637442616c616e63654d616e6970756c6174696f6e00006020830152565b6001600160a01b0381165f9081525f805160206113cf833981519152602052604090205460ff1661049d576001600160a01b03165f8181525f805160206113cf83398151915260205260408120805460ff191660011790553391905f8051602061138f8339815191528180a4600190565b505f90565b6001600160a01b0381165f9081527f3195c024b2ddd6d9b8f6c836aa52f67fe69376c8903d009b80229b3ce4425f51602052604090205460ff1661049d576001600160a01b03165f8181527f3195c024b2ddd6d9b8f6c836aa52f67fe69376c8903d009b80229b3ce4425f5160205260408120805460ff191660011790553391907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6905f8051602061138f8339815191529080a4600190565b6001600160a01b0381165f9081525f805160206113af833981519152602052604090205460ff1661049d576001600160a01b03165f8181525f805160206113af83398151915260205260408120805460ff191660011790553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a905f8051602061138f8339815191529080a460019056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146109125750806306fdde031461083f578063095ea7b31461079757806318160ddd1461077a57806323b872dd14610742578063248a9ca31461070f5780632f2ff15d146106d1578063313ce567146106b657806336568abe146106725780633f4ba83a1461060c57806340c10f191461051957806342966c68146104fc5780635c975abb146104da57806370a08231146104a357806379cc6790146104735780638456cb591461041a57806391d14854146103d157806395d89b41146102b5578063a217fddf1461029b578063a9059cbb14610231578063d5391393146101f7578063d547741f146101b2578063dd62ed3e146101625763e63ab1e914610124575f80fd5b3461015e575f36600319011261015e5760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5f80fd5b3461015e57604036600319011261015e5761017b61098f565b6101836109a5565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461015e57604036600319011261015e576101f56004356101d16109a5565b906101f06101eb825f526006602052600160405f20015490565b610b6c565b610c32565b005b3461015e575f36600319011261015e5760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b3461015e57604036600319011261015e5761024a61098f565b602435908160011c9060018060a01b03600754168284039384116102875761027c936102769133610a5e565b33610a5e565b602060405160018152f35b634e487b7160e01b5f52601160045260245ffd5b3461015e575f36600319011261015e5760206040515f8152f35b3461015e575f36600319011261015e576040515f6004548060011c906001811680156103c7575b6020831081146103b3578285529081156103975750600114610341575b50819003601f01601f191681019067ffffffffffffffff82118183101761032d5761032982918260405282610965565b0390f35b634e487b7160e01b5f52604160045260245ffd5b60045f9081529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828210610381575060209150820101826102f9565b600181602092548385880101520191019061036c565b90506020925060ff191682840152151560051b820101826102f9565b634e487b7160e01b5f52602260045260245ffd5b91607f16916102dc565b3461015e57604036600319011261015e576103ea6109a5565b6004355f52600660205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b3461015e575f36600319011261015e57610432610afd565b61043a610d2f565b600160ff1960055416176005557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b3461015e57604036600319011261015e576101f561048f61098f565b6024359061049e8233836109bb565b610cb6565b3461015e57602036600319011261015e576001600160a01b036104c461098f565b165f525f602052602060405f2054604051908152f35b3461015e575f36600319011261015e57602060ff600554166040519015158152f35b3461015e57602036600319011261015e576101f560043533610cb6565b3461015e57604036600319011261015e5761053261098f565b335f9081527f3195c024b2ddd6d9b8f6c836aa52f67fe69376c8903d009b80229b3ce4425f516020526040902054602435919060ff16156105d5576001600160a01b03169081156105c257610585610d2f565b600254908082018092116102875760205f80516020610d4b833981519152915f9360025584845283825260408420818154019055604051908152a3005b63ec442f0560e01b5f525f60045260245ffd5b63e2517d3f60e01b5f52336004527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660245260445ffd5b3461015e575f36600319011261015e57610624610afd565b60055460ff8116156106635760ff19166005557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b3461015e57604036600319011261015e5761068b6109a5565b336001600160a01b038216036106a7576101f590600435610c32565b63334bd91960e11b5f5260045ffd5b3461015e575f36600319011261015e57602060405160128152f35b3461015e57604036600319011261015e576101f56004356106f06109a5565b9061070a6101eb825f526006602052600160405f20015490565b610ba6565b3461015e57602036600319011261015e57602061073a6004355f526006602052600160405f20015490565b604051908152f35b3461015e57606036600319011261015e5761027c61075e61098f565b6107666109a5565b604435916107758333836109bb565b610a5e565b3461015e575f36600319011261015e576020600254604051908152f35b3461015e57604036600319011261015e576107b061098f565b60243590331561082c576001600160a01b031690811561081957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b3461015e575f36600319011261015e576040515f6003548060011c90600181168015610908575b6020831081146103b35782855290811561039757506001146108b25750819003601f01601f191681019067ffffffffffffffff82118183101761032d5761032982918260405282610965565b60035f9081529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8282106108f2575060209150820101826102f9565b60018160209254838588010152019101906108dd565b91607f1691610866565b3461015e57602036600319011261015e576004359063ffffffff60e01b821680920361015e57602091637965db0b60e01b8114908115610954575b5015158152f35b6301ffc9a760e01b1490508361094d565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361015e57565b602435906001600160a01b038216820361015e57565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f1984106109f5575b50505050565b828410610a3b57801561082c576001600160a01b03821615610819575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f8080806109ef565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115610aea576001600160a01b03169182156105c257610a86610d2f565b815f525f60205260405f2054818110610ad157815f80516020610d4b83398151915292602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b634b637e8f60e11b5f525f60045260245ffd5b335f9081527fe09f975e15f8f53f24cbbc282b13c40b84df485fcdb8d3997fa103dc5a4ef841602052604090205460ff1615610b3557565b63e2517d3f60e01b5f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b5f81815260066020908152604080832033845290915290205460ff1615610b905750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f8181526006602090815260408083206001600160a01b038616845290915290205460ff16610c2c575f8181526006602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181526006602090815260408083206001600160a01b038616845290915290205460ff1615610c2c575f8181526006602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b9091906001600160a01b03168015610aea57610cd0610d2f565b805f525f60205260405f2054838110610d15576020845f94955f80516020610d4b833981519152938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b60ff60055416610d3b57565b63d93c066560e01b5f5260045ffdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212205391a7dad75bef0c5f688b28904f3e94493dced42ea20fafaf0d8b024f757f8c64736f6c634300081a00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0de09f975e15f8f53f24cbbc282b13c40b84df485fcdb8d3997fa103dc5a4ef84154cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146109125750806306fdde031461083f578063095ea7b31461079757806318160ddd1461077a57806323b872dd14610742578063248a9ca31461070f5780632f2ff15d146106d1578063313ce567146106b657806336568abe146106725780633f4ba83a1461060c57806340c10f191461051957806342966c68146104fc5780635c975abb146104da57806370a08231146104a357806379cc6790146104735780638456cb591461041a57806391d14854146103d157806395d89b41146102b5578063a217fddf1461029b578063a9059cbb14610231578063d5391393146101f7578063d547741f146101b2578063dd62ed3e146101625763e63ab1e914610124575f80fd5b3461015e575f36600319011261015e5760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5f80fd5b3461015e57604036600319011261015e5761017b61098f565b6101836109a5565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461015e57604036600319011261015e576101f56004356101d16109a5565b906101f06101eb825f526006602052600160405f20015490565b610b6c565b610c32565b005b3461015e575f36600319011261015e5760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b3461015e57604036600319011261015e5761024a61098f565b602435908160011c9060018060a01b03600754168284039384116102875761027c936102769133610a5e565b33610a5e565b602060405160018152f35b634e487b7160e01b5f52601160045260245ffd5b3461015e575f36600319011261015e5760206040515f8152f35b3461015e575f36600319011261015e576040515f6004548060011c906001811680156103c7575b6020831081146103b3578285529081156103975750600114610341575b50819003601f01601f191681019067ffffffffffffffff82118183101761032d5761032982918260405282610965565b0390f35b634e487b7160e01b5f52604160045260245ffd5b60045f9081529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828210610381575060209150820101826102f9565b600181602092548385880101520191019061036c565b90506020925060ff191682840152151560051b820101826102f9565b634e487b7160e01b5f52602260045260245ffd5b91607f16916102dc565b3461015e57604036600319011261015e576103ea6109a5565b6004355f52600660205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b3461015e575f36600319011261015e57610432610afd565b61043a610d2f565b600160ff1960055416176005557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b3461015e57604036600319011261015e576101f561048f61098f565b6024359061049e8233836109bb565b610cb6565b3461015e57602036600319011261015e576001600160a01b036104c461098f565b165f525f602052602060405f2054604051908152f35b3461015e575f36600319011261015e57602060ff600554166040519015158152f35b3461015e57602036600319011261015e576101f560043533610cb6565b3461015e57604036600319011261015e5761053261098f565b335f9081527f3195c024b2ddd6d9b8f6c836aa52f67fe69376c8903d009b80229b3ce4425f516020526040902054602435919060ff16156105d5576001600160a01b03169081156105c257610585610d2f565b600254908082018092116102875760205f80516020610d4b833981519152915f9360025584845283825260408420818154019055604051908152a3005b63ec442f0560e01b5f525f60045260245ffd5b63e2517d3f60e01b5f52336004527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660245260445ffd5b3461015e575f36600319011261015e57610624610afd565b60055460ff8116156106635760ff19166005557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b3461015e57604036600319011261015e5761068b6109a5565b336001600160a01b038216036106a7576101f590600435610c32565b63334bd91960e11b5f5260045ffd5b3461015e575f36600319011261015e57602060405160128152f35b3461015e57604036600319011261015e576101f56004356106f06109a5565b9061070a6101eb825f526006602052600160405f20015490565b610ba6565b3461015e57602036600319011261015e57602061073a6004355f526006602052600160405f20015490565b604051908152f35b3461015e57606036600319011261015e5761027c61075e61098f565b6107666109a5565b604435916107758333836109bb565b610a5e565b3461015e575f36600319011261015e576020600254604051908152f35b3461015e57604036600319011261015e576107b061098f565b60243590331561082c576001600160a01b031690811561081957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b3461015e575f36600319011261015e576040515f6003548060011c90600181168015610908575b6020831081146103b35782855290811561039757506001146108b25750819003601f01601f191681019067ffffffffffffffff82118183101761032d5761032982918260405282610965565b60035f9081529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8282106108f2575060209150820101826102f9565b60018160209254838588010152019101906108dd565b91607f1691610866565b3461015e57602036600319011261015e576004359063ffffffff60e01b821680920361015e57602091637965db0b60e01b8114908115610954575b5015158152f35b6301ffc9a760e01b1490508361094d565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361015e57565b602435906001600160a01b038216820361015e57565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f1984106109f5575b50505050565b828410610a3b57801561082c576001600160a01b03821615610819575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f8080806109ef565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115610aea576001600160a01b03169182156105c257610a86610d2f565b815f525f60205260405f2054818110610ad157815f80516020610d4b83398151915292602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b634b637e8f60e11b5f525f60045260245ffd5b335f9081527fe09f975e15f8f53f24cbbc282b13c40b84df485fcdb8d3997fa103dc5a4ef841602052604090205460ff1615610b3557565b63e2517d3f60e01b5f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b5f81815260066020908152604080832033845290915290205460ff1615610b905750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f8181526006602090815260408083206001600160a01b038616845290915290205460ff16610c2c575f8181526006602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181526006602090815260408083206001600160a01b038616845290915290205460ff1615610c2c575f8181526006602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b9091906001600160a01b03168015610aea57610cd0610d2f565b805f525f60205260405f2054838110610d15576020845f94955f80516020610d4b833981519152938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b60ff60055416610d3b57565b63d93c066560e01b5f5260045ffdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212205391a7dad75bef0c5f688b28904f3e94493dced42ea20fafaf0d8b024f757f8c64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol b/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol index ae02b90d1..06c549652 100644 --- a/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol +++ b/x/erc20/keeper/testdata/ERC20DirectBalanceManipulation.sol @@ -1,18 +1,39 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.20; -import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol"; // This is an evil token. Whenever an A -> B transfer is called, half of the amount goes to B // and half to a predefined C -contract ERC20DirectBalanceManipulation is ERC20PresetMinterPauser { +contract ERC20DirectBalanceManipulation is ERC20, ERC20Burnable, ERC20Pausable, AccessControl { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + address private _thief = 0x4dC6ac40Af078661fc43823086E1513635Eeab14; - constructor(uint256 initialSupply) - ERC20PresetMinterPauser("ERC20DirectBalanceManipulation", "ERC20DirectBalanceManipulation") { - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - _mint(msg.sender, initialSupply); + + constructor(uint256 initialSupply) ERC20("ERC20DirectBalanceManipulation", "ERC20DirectBalanceManipulation") { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + _grantRole(MINTER_ROLE, msg.sender); + _grantRole(PAUSER_ROLE, msg.sender); + _mint(msg.sender, initialSupply); + } + + function pause() public onlyRole(PAUSER_ROLE) { + _pause(); + } + + function unpause() public onlyRole(PAUSER_ROLE) { + _unpause(); } + + function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) { + _mint(to, amount); + } + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { // Any time a transaction happens, the thief account siphons half. uint256 half = amount / 2; @@ -20,4 +41,8 @@ contract ERC20DirectBalanceManipulation is ERC20PresetMinterPauser { super.transfer(_thief, amount - half); // a - h for rounding return super.transfer(recipient, half); } + + function _update(address from, address to, uint256 value) internal override(ERC20, ERC20Pausable) { + super._update(from, to, value); + } } diff --git a/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json b/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json index 2c92d92cc..cfe0771f7 100644 --- a/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json +++ b/x/erc20/keeper/testdata/ERC20MaliciousDelayed.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "ERC20MaliciousDelayed", "sourceName": "solidity/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol", "abi": [ @@ -14,6 +14,123 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -237,7 +354,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -275,7 +392,7 @@ "inputs": [ { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -293,7 +410,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -315,30 +432,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -358,49 +451,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -443,30 +493,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -527,7 +553,7 @@ }, { "internalType": "address", - "name": "account", + "name": "callerConfirmation", "type": "address" } ], @@ -637,7 +663,7 @@ }, { "internalType": "uint256", - "name": "amount", + "name": "value", "type": "uint256" } ], @@ -660,8 +686,11 @@ "type": "function" } ], - "bytecode": "0x608034620006ad57601f62001f4938819003828101601f199081168501946001600160401b03949093909285871185881017620005c85780859260409889528339602094859181010312620006ad5751936200005a620006b2565b91601583527f45524332304d616c6963696f757344656c617965640000000000000000000000858401526200008e620006b2565b90601582527f45524332304d414c4943494f555344454c41594544000000000000000000000086830152835191838311620005c85760059283546001968782811c92168015620006a2575b8a831014620005a75781898493116200064e575b508990898311600114620005ea57600092620005de575b5050600019600383901b1c191690861b1783555b8051938411620005c8576006548581811c91168015620005bd575b88821014620005a75784938782116200054e575b50508691868411600114620004e75750600092620004db575b5050600019600383901b1c191690821b176006555b60ff19806007541660075560008052600084528560002033600052845260ff86600020541615620004a0575b60008052818452620001b73387600020620006d2565b507f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a680600052600085528660002033600052855260ff8760002054161562000465575b6000528184526200020f3387600020620006d2565b507f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a80600052600085528660002033600052855260ff876000205416156200042a575b600052818452620002673387600020620006d2565b5060078054610100600160a81b031916744dc6ac40af078661fc43823086e1513635eeab1400179055670de0b6b3a7640000600855600080805280855286812033825285528690205460ff1615620003ee575b50600080528252620002d03385600020620006d2565b503315620003ac575060ff60075416620003565760045482810180911162000340576000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916004553383526002815284832084815401905584519384523393a3516117c99081620007608239f35b634e487b7160e01b600052601160045260246000fd5b60849083519062461bcd60e51b82526004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152fd5b6064925083519162461bcd60e51b8352600483015260248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b6000805260008452856000203360005284528186600020918254161790553333600060008051602062001f298339815191528180a438620002ba565b80600052600085528660002033600052855286600020838382541617905533338260008051602062001f29833981519152600080a462000252565b80600052600085528660002033600052855286600020838382541617905533338260008051602062001f29833981519152600080a4620001fa565b6000805260008452856000203360005284528560002082828254161790553333600060008051602062001f298339815191528180a4620001a1565b01519050388062000160565b859492919216916006600052876000209260005b898282106200053757505084116200051d575b505050811b0160065562000175565b015160001960f88460031b161c191690553880806200050e565b8385015186558897909501949384019301620004fb565b90919293506006600052876000209087808701821c8301938a88106200059d575b91879695949391899301901c01915b8281106200058d575062000147565b600081558695508791016200057e565b935082936200056f565b634e487b7160e01b600052602260045260246000fd5b90607f169062000133565b634e487b7160e01b600052604160045260246000fd5b01519050388062000104565b908589941691876000528b6000209260005b8d8282106200063757505084116200061d575b505050811b01835562000118565b015160001960f88460031b161c191690553880806200060f565b8385015186558c97909501949384019301620005fc565b909150856000528960002089808501881c8201928c861062000698575b918a918695949301891c01915b82811062000688575050620000ed565b600081558594508a910162000678565b925081926200066b565b91607f1691620000d9565b600080fd5b60408051919082016001600160401b03811183821017620005c857604052565b919060018301600090828252806020526040822054156000146200075957845494680100000000000000008610156200074557600186018082558610156200073157836040949596828552602085200155549382526020522055600190565b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b83526041600452602483fd5b5092505056fe608060408181526004918236101561001657600080fd5b600092833560e01c91826301ffc9a714610c3f5750816306fdde0314610b9e578163095ea7b314610b7457816318160ddd14610b5657816323b872dd14610b19578163248a9ca314610aef5781632f2ff15d14610a3b578163313ce56714610a1f57816336568abe1461098d578163395093511461093d5781633f4ba83a1461083357816340c10f191461069e57816342966c68146106805781635c975abb1461065c57816370a082311461062457816379cc6790146105f45781638456cb59146104ee5781639010d07c146104ad57816391d148541461046757816395d89b4114610382578163a217fddf14610367578163a457c2d7146102bf578163a9059cbb14610271578163ca15c87314610249578163d53913931461020e578163d547741f146101cc57508063dd62ed3e146101845763e63ab1e91461015957600080fd5b34610180578160031936011261018057602090516000805160206117548339815191528152f35b5080fd5b5034610180578060031936011261018057806020926101a1610cfb565b6101a9610d16565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b9190503461020a578060031936011261020a57610207913561020260016101f1610d16565b938387528660205286200154610d2c565b61108c565b80f35b8280fd5b505034610180578160031936011261018057602090517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b90503461020a57602036600319011261020a5760209282913581526001845220549051908152f35b5050346101805780600319360112610180576020906102b8610291610cfb565b600754600880546102ae9290911c6001600160a01b0316836112f6565b6024359033611136565b5160018152f35b905082346103645782600319360112610364576102da610cfb565b918360243592338152600360205281812060018060a01b0386168252602052205490828210610313576020856102b885850387336112f6565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b80fd5b50503461018057816003193601126101805751908152602090f35b9190503461020a578260031936011261020a57805191836006549060019082821c92828116801561045d575b602095868610821461044a575084885290811561042857506001146103ed575b6103e986866103df828b0383611054565b5191829182610ccf565b0390f35b929550600683528583205b82841061041557505050826103e9946103df9282010194386103ce565b80548685018801529286019281016103f8565b60ff191687860152505050151560051b83010192506103df826103e9386103ce565b634e487b7160e01b845260229052602483fd5b93607f16936103ae565b90503461020a578160031936011261020a578160209360ff92610488610d16565b903582528186528282206001600160a01b039091168252855220549151911615158152f35b90503461020a578160031936011261020a576020926104d891358152600184528260243591206115ba565b905491519160018060a01b039160031b1c168152f35b90503461020a578260031936011261020a5760008051602061175483398151915283528260205281832033845260205260ff8284205416156105a4576007549060ff821661056e575060ff1916600117600755513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a180f35b606490602084519162461bcd60e51b8352820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152fd5b6020608492519162461bcd60e51b83528201526037602482015260008051602061173483398151915260448201527676652070617573657220726f6c6520746f20706175736560481b6064820152fd5b5050346101805736600319011261036457610207610610610cfb565b6024359061061f8233836113f8565b611490565b5050346101805760203660031901126101805760209181906001600160a01b0361064c610cfb565b1681526002845220549051908152f35b50503461018057816003193601126101805760209060ff6007541690519015158152f35b83903461018057602036600319011261018057610207903533611490565b9190503461020a578060031936011261020a576106b9610cfb565b90602435907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68552602092858452818620338752845260ff8287205416156107e3576001600160a01b03169384156107a25760ff6007541661074e579185939183610734836000805160206117748339815191529654611113565b90558585526002835280852082815401905551908152a380f35b83608492519162461bcd60e51b8352820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152fd5b83606492519162461bcd60e51b8352820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b815162461bcd60e51b8152808601859052603660248201526000805160206117348339815191526044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b6064820152608490fd5b90503461020a578260031936011261020a5760008051602061175483398151915283528260205281832033845260205260ff8284205416156108eb576007549060ff8216156108b1575060ff1916600755513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b6020608492519162461bcd60e51b83528201526039602482015260008051602061173483398151915260448201527876652070617573657220726f6c6520746f20756e706175736560381b6064820152fd5b5050346101805780600319360112610180576102b8602092610986610960610cfb565b338352600386528483206001600160a01b03821684528652918490205460243590611113565b90336112f6565b839150346101805782600319360112610180576109a8610d16565b90336001600160a01b038316036109c45790610207913561108c565b608490602085519162461bcd60e51b8352820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152fd5b5050346101805781600319360112610180576020905160128152f35b9190503461020a578060031936011261020a57610aa49135906001610a5e610d16565b92808652602090868252610a76838589200154610d2c565b80875286825283872094838060a01b031694858852825260ff848820541615610aa8575b86525283206115d2565b5080f35b8087528682528387208588528252838720805460ff1916841790553385827f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8a80a4610a9a565b90503461020a57602036600319011261020a57816020936001923581528085522001549051908152f35b505034610180576060366003190112610180576020906102b8610b3a610cfb565b610b42610d16565b60443591610b518333836113f8565b611136565b90503461020a578260031936011261020a5760209250549051908152f35b5050346101805780600319360112610180576020906102b8610b94610cfb565b60243590336112f6565b9190503461020a578260031936011261020a57805191836005549060019082821c928281168015610c35575b602095868610821461044a57508488529081156104285750600114610bfa576103e986866103df828b0383611054565b929550600583528583205b828410610c2257505050826103e9946103df9282010194386103ce565b8054868501880152928601928101610c05565b93607f1693610bca565b84913461020a57602036600319011261020a573563ffffffff60e01b811680910361020a5760209250635a05180f60e01b8114908115610c81575b5015158152f35b637965db0b60e01b811491508115610c9b575b5083610c7a565b6301ffc9a760e01b14905083610c94565b60005b838110610cbf5750506000910152565b8181015183820152602001610caf565b60409160208252610cef8151809281602086015260208686019101610cac565b601f01601f1916010190565b600435906001600160a01b0382168203610d1157565b600080fd5b602435906001600160a01b0382168203610d1157565b6000818152602090808252604092838220338352835260ff848320541615610d545750505050565b835167ffffffffffffffff9190336060820184811183821017611040578752602a8252858201928736853782511561102c5760308453825191600192831015611018576078602185015360295b838111610fae5750610f6c5790875194608086019086821090821117610f5857885260428552868501956060368837855115610f4457603087538551821015610f445790607860218701536041915b818311610ed657505050610e9457938593610e7a93610e6b604894610e4276020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b99610e909b519a8b978801525180926037880190610cac565b8401917001034b99036b4b9b9b4b733903937b6329607d1b603784015251809386840190610cac565b01036028810185520183611054565b5162461bcd60e51b815291829160048301610ccf565b0390fd5b60648587519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f81166010811015610f30576f181899199a1a9b1b9c1cb0b131b232b360811b901a610f068589611593565b5360041c928015610f1c57600019019190610df0565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b87526041600452602487fd5b60648789519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b90600f81166010811015611004576f181899199a1a9b1b9c1cb0b131b232b360811b901a610fdc8387611593565b5360041c908015610ff05760001901610da1565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b87526032600452602487fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b86526041600452602486fd5b90601f8019910116810190811067ffffffffffffffff82111761107657604052565b634e487b7160e01b600052604160045260246000fd5b9060406110c992600090808252816020528282209360018060a01b03169384835260205260ff83832054166110cc575b8152600160205220611657565b50565b8082528160205282822084835260205282822060ff1981541690553384827ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8580a46110bc565b9190820180921161112057565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b039081169182156112a357169182156112525760ff600754166111fa57600082815260026020526040812054918083106111a6576040828260008051602061177483398151915295876020965260028652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6001600160a01b039081169182156113a757169182156113575760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260038252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b9060018060a01b0380831660005260036020526040600020908216600052602052604060002054926000198403611430575b50505050565b80841061144b576114429303916112f6565b3880808061142a565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b6001600160a01b031680156115445760ff600754166111fa57806000526002602052604060002054918083106114f45760208160008051602061177483398151915292600095858752600284520360408620558060045403600455604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b9081518110156115a4570160200190565b634e487b7160e01b600052603260045260246000fd5b80548210156115a45760005260206000200190600090565b9190600183016000908282528060205260408220541560001461165157845494600160401b86101561163d578361162d611616886001604098999a018555846115ba565b819391549060031b91821b91600019901b19161790565b9055549382526020522055600190565b634e487b7160e01b83526041600452602483fd5b50925050565b9060018201906000928184528260205260408420549081151560001461172c576000199180830181811161171857825490848201918211610ff0578082036116e3575b505050805480156116cf578201916116b283836115ba565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6117036116f361161693866115ba565b90549060031b1c928392866115ba565b9055865284602052604086205538808061169a565b634e487b7160e01b87526011600452602487fd5b505050509056fe45524332305072657365744d696e7465725061757365723a206d75737420686165d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ec73c04cf4f0e3e343c75efacb35e3cd998ec74c7392e9a70a70d062b788b23d64736f6c634300081400332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", - "deployedBytecode": "0x608060408181526004918236101561001657600080fd5b600092833560e01c91826301ffc9a714610c3f5750816306fdde0314610b9e578163095ea7b314610b7457816318160ddd14610b5657816323b872dd14610b19578163248a9ca314610aef5781632f2ff15d14610a3b578163313ce56714610a1f57816336568abe1461098d578163395093511461093d5781633f4ba83a1461083357816340c10f191461069e57816342966c68146106805781635c975abb1461065c57816370a082311461062457816379cc6790146105f45781638456cb59146104ee5781639010d07c146104ad57816391d148541461046757816395d89b4114610382578163a217fddf14610367578163a457c2d7146102bf578163a9059cbb14610271578163ca15c87314610249578163d53913931461020e578163d547741f146101cc57508063dd62ed3e146101845763e63ab1e91461015957600080fd5b34610180578160031936011261018057602090516000805160206117548339815191528152f35b5080fd5b5034610180578060031936011261018057806020926101a1610cfb565b6101a9610d16565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b9190503461020a578060031936011261020a57610207913561020260016101f1610d16565b938387528660205286200154610d2c565b61108c565b80f35b8280fd5b505034610180578160031936011261018057602090517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b90503461020a57602036600319011261020a5760209282913581526001845220549051908152f35b5050346101805780600319360112610180576020906102b8610291610cfb565b600754600880546102ae9290911c6001600160a01b0316836112f6565b6024359033611136565b5160018152f35b905082346103645782600319360112610364576102da610cfb565b918360243592338152600360205281812060018060a01b0386168252602052205490828210610313576020856102b885850387336112f6565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b80fd5b50503461018057816003193601126101805751908152602090f35b9190503461020a578260031936011261020a57805191836006549060019082821c92828116801561045d575b602095868610821461044a575084885290811561042857506001146103ed575b6103e986866103df828b0383611054565b5191829182610ccf565b0390f35b929550600683528583205b82841061041557505050826103e9946103df9282010194386103ce565b80548685018801529286019281016103f8565b60ff191687860152505050151560051b83010192506103df826103e9386103ce565b634e487b7160e01b845260229052602483fd5b93607f16936103ae565b90503461020a578160031936011261020a578160209360ff92610488610d16565b903582528186528282206001600160a01b039091168252855220549151911615158152f35b90503461020a578160031936011261020a576020926104d891358152600184528260243591206115ba565b905491519160018060a01b039160031b1c168152f35b90503461020a578260031936011261020a5760008051602061175483398151915283528260205281832033845260205260ff8284205416156105a4576007549060ff821661056e575060ff1916600117600755513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a180f35b606490602084519162461bcd60e51b8352820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152fd5b6020608492519162461bcd60e51b83528201526037602482015260008051602061173483398151915260448201527676652070617573657220726f6c6520746f20706175736560481b6064820152fd5b5050346101805736600319011261036457610207610610610cfb565b6024359061061f8233836113f8565b611490565b5050346101805760203660031901126101805760209181906001600160a01b0361064c610cfb565b1681526002845220549051908152f35b50503461018057816003193601126101805760209060ff6007541690519015158152f35b83903461018057602036600319011261018057610207903533611490565b9190503461020a578060031936011261020a576106b9610cfb565b90602435907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68552602092858452818620338752845260ff8287205416156107e3576001600160a01b03169384156107a25760ff6007541661074e579185939183610734836000805160206117748339815191529654611113565b90558585526002835280852082815401905551908152a380f35b83608492519162461bcd60e51b8352820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152fd5b83606492519162461bcd60e51b8352820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b815162461bcd60e51b8152808601859052603660248201526000805160206117348339815191526044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b6064820152608490fd5b90503461020a578260031936011261020a5760008051602061175483398151915283528260205281832033845260205260ff8284205416156108eb576007549060ff8216156108b1575060ff1916600755513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b6020608492519162461bcd60e51b83528201526039602482015260008051602061173483398151915260448201527876652070617573657220726f6c6520746f20756e706175736560381b6064820152fd5b5050346101805780600319360112610180576102b8602092610986610960610cfb565b338352600386528483206001600160a01b03821684528652918490205460243590611113565b90336112f6565b839150346101805782600319360112610180576109a8610d16565b90336001600160a01b038316036109c45790610207913561108c565b608490602085519162461bcd60e51b8352820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152fd5b5050346101805781600319360112610180576020905160128152f35b9190503461020a578060031936011261020a57610aa49135906001610a5e610d16565b92808652602090868252610a76838589200154610d2c565b80875286825283872094838060a01b031694858852825260ff848820541615610aa8575b86525283206115d2565b5080f35b8087528682528387208588528252838720805460ff1916841790553385827f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8a80a4610a9a565b90503461020a57602036600319011261020a57816020936001923581528085522001549051908152f35b505034610180576060366003190112610180576020906102b8610b3a610cfb565b610b42610d16565b60443591610b518333836113f8565b611136565b90503461020a578260031936011261020a5760209250549051908152f35b5050346101805780600319360112610180576020906102b8610b94610cfb565b60243590336112f6565b9190503461020a578260031936011261020a57805191836005549060019082821c928281168015610c35575b602095868610821461044a57508488529081156104285750600114610bfa576103e986866103df828b0383611054565b929550600583528583205b828410610c2257505050826103e9946103df9282010194386103ce565b8054868501880152928601928101610c05565b93607f1693610bca565b84913461020a57602036600319011261020a573563ffffffff60e01b811680910361020a5760209250635a05180f60e01b8114908115610c81575b5015158152f35b637965db0b60e01b811491508115610c9b575b5083610c7a565b6301ffc9a760e01b14905083610c94565b60005b838110610cbf5750506000910152565b8181015183820152602001610caf565b60409160208252610cef8151809281602086015260208686019101610cac565b601f01601f1916010190565b600435906001600160a01b0382168203610d1157565b600080fd5b602435906001600160a01b0382168203610d1157565b6000818152602090808252604092838220338352835260ff848320541615610d545750505050565b835167ffffffffffffffff9190336060820184811183821017611040578752602a8252858201928736853782511561102c5760308453825191600192831015611018576078602185015360295b838111610fae5750610f6c5790875194608086019086821090821117610f5857885260428552868501956060368837855115610f4457603087538551821015610f445790607860218701536041915b818311610ed657505050610e9457938593610e7a93610e6b604894610e4276020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b99610e909b519a8b978801525180926037880190610cac565b8401917001034b99036b4b9b9b4b733903937b6329607d1b603784015251809386840190610cac565b01036028810185520183611054565b5162461bcd60e51b815291829160048301610ccf565b0390fd5b60648587519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f81166010811015610f30576f181899199a1a9b1b9c1cb0b131b232b360811b901a610f068589611593565b5360041c928015610f1c57600019019190610df0565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b634e487b7160e01b87526041600452602487fd5b60648789519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b90600f81166010811015611004576f181899199a1a9b1b9c1cb0b131b232b360811b901a610fdc8387611593565b5360041c908015610ff05760001901610da1565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b87526032600452602487fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b86526041600452602486fd5b90601f8019910116810190811067ffffffffffffffff82111761107657604052565b634e487b7160e01b600052604160045260246000fd5b9060406110c992600090808252816020528282209360018060a01b03169384835260205260ff83832054166110cc575b8152600160205220611657565b50565b8082528160205282822084835260205282822060ff1981541690553384827ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8580a46110bc565b9190820180921161112057565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b039081169182156112a357169182156112525760ff600754166111fa57600082815260026020526040812054918083106111a6576040828260008051602061177483398151915295876020965260028652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6001600160a01b039081169182156113a757169182156113575760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260038252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b9060018060a01b0380831660005260036020526040600020908216600052602052604060002054926000198403611430575b50505050565b80841061144b576114429303916112f6565b3880808061142a565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b6001600160a01b031680156115445760ff600754166111fa57806000526002602052604060002054918083106114f45760208160008051602061177483398151915292600095858752600284520360408620558060045403600455604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b9081518110156115a4570160200190565b634e487b7160e01b600052603260045260246000fd5b80548210156115a45760005260206000200190600090565b9190600183016000908282528060205260408220541560001461165157845494600160401b86101561163d578361162d611616886001604098999a018555846115ba565b819391549060031b91821b91600019901b19161790565b9055549382526020522055600190565b634e487b7160e01b83526041600452602483fd5b50925050565b9060018201906000928184528260205260408420549081151560001461172c576000199180830181811161171857825490848201918211610ff0578082036116e3575b505050805480156116cf578201916116b283836115ba565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6117036116f361161693866115ba565b90549060031b1c928392866115ba565b9055865284602052604086205538808061169a565b634e487b7160e01b87526011600452602487fd5b505050509056fe45524332305072657365744d696e7465725061757365723a206d75737420686165d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ec73c04cf4f0e3e343c75efacb35e3cd998ec74c7392e9a70a70d062b788b23d64736f6c63430008140033", + "bytecode": "0x6080604052346104285761140f6020813803918261001c8161042c565b9384928339810103126104285751610034604061042c565b90601582527f45524332304d616c6963696f757344656c6179656400000000000000000000006020830152610069604061042c565b601581527f45524332304d414c4943494f555344454c415945440000000000000000000000602082015282519091906001600160401b03811161033957600354600181811c9116801561041e575b602082101461031b57601f81116103bb575b506020601f821160011461035857819293945f9261034d575b50508160011b915f199060031b1c1916176003555b81516001600160401b03811161033957600454600181811c9116801561032f575b602082101461031b57601f81116102b8575b50602092601f821160011461025757928192935f9261024c575b50508160011b915f199060031b1c1916176004555b600780546001600160a01b031916734dc6ac40af078661fc43823086e1513635eeab14179055670de0b6b3a764000060085561019433610451565b5061019e336104c7565b506101a833610580565b5033156102395760ff6005541661022a5760025481810180911161021657600255335f525f60205260405f208181540190556040519081525f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a3604051610d9b90816106148239f35b634e487b7160e01b5f52601160045260245ffd5b63d93c066560e01b5f5260045ffd5b63ec442f0560e01b5f525f60045260245ffd5b015190505f80610144565b601f1982169360045f52805f20915f5b8681106102a05750836001959610610288575b505050811b01600455610159565b01515f1960f88460031b161c191690555f808061027a565b91926020600181928685015181550194019201610267565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c81019160208410610311575b601f0160051c01905b818110610306575061012a565b5f81556001016102f9565b90915081906102f0565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610118565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100e2565b601f1982169060035f52805f20915f5b8181106103a35750958360019596971061038b575b505050811b016003556100f7565b01515f1960f88460031b161c191690555f808061037d565b9192602060018192868b015181550194019201610368565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c81019160208410610414575b601f0160051c01905b81811061040957506100c9565b5f81556001016103fc565b90915081906103f3565b90607f16906100b7565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761033957604052565b6001600160a01b0381165f9081525f805160206113ef833981519152602052604090205460ff166104c2576001600160a01b03165f8181525f805160206113ef83398151915260205260408120805460ff191660011790553391905f805160206113af8339815191528180a4600190565b505f90565b6001600160a01b0381165f9081527f3195c024b2ddd6d9b8f6c836aa52f67fe69376c8903d009b80229b3ce4425f51602052604090205460ff166104c2576001600160a01b03165f8181527f3195c024b2ddd6d9b8f6c836aa52f67fe69376c8903d009b80229b3ce4425f5160205260408120805460ff191660011790553391907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6905f805160206113af8339815191529080a4600190565b6001600160a01b0381165f9081525f805160206113cf833981519152602052604090205460ff166104c2576001600160a01b03165f8181525f805160206113cf83398151915260205260408120805460ff191660011790553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a905f805160206113af8339815191529080a460019056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146108845750806306fdde03146107b1578063095ea7b31461078b57806318160ddd1461076e57806323b872dd14610736578063248a9ca3146107035780632f2ff15d146106c5578063313ce567146106aa57806336568abe146106665780633f4ba83a1461060057806340c10f19146104f957806342966c68146104dc5780635c975abb146104ba57806370a082311461048357806379cc6790146104535780638456cb59146103fa57806391d14854146103b157806395d89b4114610295578063a217fddf1461027b578063a9059cbb14610231578063d5391393146101f7578063d547741f146101b2578063dd62ed3e146101625763e63ab1e914610124575f80fd5b3461015e575f36600319011261015e5760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5f80fd5b3461015e57604036600319011261015e5761017b610901565b610183610917565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461015e57604036600319011261015e576101f56004356101d1610917565b906101f06101eb825f526006602052600160405f20015490565b610b04565b610bca565b005b3461015e575f36600319011261015e5760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b3461015e57604036600319011261015e5761027061024d610901565b600754600854610266916001600160a01b031683610cc7565b60243590336109f6565b602060405160018152f35b3461015e575f36600319011261015e5760206040515f8152f35b3461015e575f36600319011261015e576040515f6004548060011c906001811680156103a7575b602083108114610393578285529081156103775750600114610321575b50819003601f01601f191681019067ffffffffffffffff82118183101761030d57610309829182604052826108d7565b0390f35b634e487b7160e01b5f52604160045260245ffd5b60045f9081529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828210610361575060209150820101826102d9565b600181602092548385880101520191019061034c565b90506020925060ff191682840152151560051b820101826102d9565b634e487b7160e01b5f52602260045260245ffd5b91607f16916102bc565b3461015e57604036600319011261015e576103ca610917565b6004355f52600660205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b3461015e575f36600319011261015e57610412610a95565b61041a610d2a565b600160ff1960055416176005557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b3461015e57604036600319011261015e576101f561046f610901565b6024359061047e82338361092d565b610c4e565b3461015e57602036600319011261015e576001600160a01b036104a4610901565b165f525f602052602060405f2054604051908152f35b3461015e575f36600319011261015e57602060ff600554166040519015158152f35b3461015e57602036600319011261015e576101f560043533610c4e565b3461015e57604036600319011261015e57610512610901565b335f9081527f3195c024b2ddd6d9b8f6c836aa52f67fe69376c8903d009b80229b3ce4425f516020526040902054602435919060ff16156105c9576001600160a01b03169081156105b657610565610d2a565b600254908082018092116105a25760205f80516020610d46833981519152915f9360025584845283825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b63e2517d3f60e01b5f52336004527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660245260445ffd5b3461015e575f36600319011261015e57610618610a95565b60055460ff8116156106575760ff19166005557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b3461015e57604036600319011261015e5761067f610917565b336001600160a01b0382160361069b576101f590600435610bca565b63334bd91960e11b5f5260045ffd5b3461015e575f36600319011261015e57602060405160128152f35b3461015e57604036600319011261015e576101f56004356106e4610917565b906106fe6101eb825f526006602052600160405f20015490565b610b3e565b3461015e57602036600319011261015e57602061072e6004355f526006602052600160405f20015490565b604051908152f35b3461015e57606036600319011261015e57610270610752610901565b61075a610917565b6044359161076983338361092d565b6109f6565b3461015e575f36600319011261015e576020600254604051908152f35b3461015e57604036600319011261015e576102706107a7610901565b6024359033610cc7565b3461015e575f36600319011261015e576040515f6003548060011c9060018116801561087a575b6020831081146103935782855290811561037757506001146108245750819003601f01601f191681019067ffffffffffffffff82118183101761030d57610309829182604052826108d7565b60035f9081529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b828210610864575060209150820101826102d9565b600181602092548385880101520191019061084f565b91607f16916107d8565b3461015e57602036600319011261015e576004359063ffffffff60e01b821680920361015e57602091637965db0b60e01b81149081156108c6575b5015158152f35b6301ffc9a760e01b149050836108bf565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361015e57565b602435906001600160a01b038216820361015e57565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f198410610967575b50505050565b8284106109d35780156109c0576001600160a01b038216156109ad575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f808080610961565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115610a82576001600160a01b03169182156105b657610a1e610d2a565b815f525f60205260405f2054818110610a6957815f80516020610d4683398151915292602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b634b637e8f60e11b5f525f60045260245ffd5b335f9081527fe09f975e15f8f53f24cbbc282b13c40b84df485fcdb8d3997fa103dc5a4ef841602052604090205460ff1615610acd57565b63e2517d3f60e01b5f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b5f81815260066020908152604080832033845290915290205460ff1615610b285750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f8181526006602090815260408083206001600160a01b038616845290915290205460ff16610bc4575f8181526006602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181526006602090815260408083206001600160a01b038616845290915290205460ff1615610bc4575f8181526006602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b9091906001600160a01b03168015610a8257610c68610d2a565b805f525f60205260405f2054838110610cad576020845f94955f80516020610d46833981519152938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b6001600160a01b03169081156109c0576001600160a01b03169182156109ad5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60ff60055416610d3657565b63d93c066560e01b5f5260045ffdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202f9b86cfcf530bd9ec296a99086d465963963328007fa438d36ffe0648c4ecaf64736f6c634300081a00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0de09f975e15f8f53f24cbbc282b13c40b84df485fcdb8d3997fa103dc5a4ef84154cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146108845750806306fdde03146107b1578063095ea7b31461078b57806318160ddd1461076e57806323b872dd14610736578063248a9ca3146107035780632f2ff15d146106c5578063313ce567146106aa57806336568abe146106665780633f4ba83a1461060057806340c10f19146104f957806342966c68146104dc5780635c975abb146104ba57806370a082311461048357806379cc6790146104535780638456cb59146103fa57806391d14854146103b157806395d89b4114610295578063a217fddf1461027b578063a9059cbb14610231578063d5391393146101f7578063d547741f146101b2578063dd62ed3e146101625763e63ab1e914610124575f80fd5b3461015e575f36600319011261015e5760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5f80fd5b3461015e57604036600319011261015e5761017b610901565b610183610917565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461015e57604036600319011261015e576101f56004356101d1610917565b906101f06101eb825f526006602052600160405f20015490565b610b04565b610bca565b005b3461015e575f36600319011261015e5760206040517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68152f35b3461015e57604036600319011261015e5761027061024d610901565b600754600854610266916001600160a01b031683610cc7565b60243590336109f6565b602060405160018152f35b3461015e575f36600319011261015e5760206040515f8152f35b3461015e575f36600319011261015e576040515f6004548060011c906001811680156103a7575b602083108114610393578285529081156103775750600114610321575b50819003601f01601f191681019067ffffffffffffffff82118183101761030d57610309829182604052826108d7565b0390f35b634e487b7160e01b5f52604160045260245ffd5b60045f9081529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828210610361575060209150820101826102d9565b600181602092548385880101520191019061034c565b90506020925060ff191682840152151560051b820101826102d9565b634e487b7160e01b5f52602260045260245ffd5b91607f16916102bc565b3461015e57604036600319011261015e576103ca610917565b6004355f52600660205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b3461015e575f36600319011261015e57610412610a95565b61041a610d2a565b600160ff1960055416176005557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b3461015e57604036600319011261015e576101f561046f610901565b6024359061047e82338361092d565b610c4e565b3461015e57602036600319011261015e576001600160a01b036104a4610901565b165f525f602052602060405f2054604051908152f35b3461015e575f36600319011261015e57602060ff600554166040519015158152f35b3461015e57602036600319011261015e576101f560043533610c4e565b3461015e57604036600319011261015e57610512610901565b335f9081527f3195c024b2ddd6d9b8f6c836aa52f67fe69376c8903d009b80229b3ce4425f516020526040902054602435919060ff16156105c9576001600160a01b03169081156105b657610565610d2a565b600254908082018092116105a25760205f80516020610d46833981519152915f9360025584845283825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b63e2517d3f60e01b5f52336004527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660245260445ffd5b3461015e575f36600319011261015e57610618610a95565b60055460ff8116156106575760ff19166005557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b3461015e57604036600319011261015e5761067f610917565b336001600160a01b0382160361069b576101f590600435610bca565b63334bd91960e11b5f5260045ffd5b3461015e575f36600319011261015e57602060405160128152f35b3461015e57604036600319011261015e576101f56004356106e4610917565b906106fe6101eb825f526006602052600160405f20015490565b610b3e565b3461015e57602036600319011261015e57602061072e6004355f526006602052600160405f20015490565b604051908152f35b3461015e57606036600319011261015e57610270610752610901565b61075a610917565b6044359161076983338361092d565b6109f6565b3461015e575f36600319011261015e576020600254604051908152f35b3461015e57604036600319011261015e576102706107a7610901565b6024359033610cc7565b3461015e575f36600319011261015e576040515f6003548060011c9060018116801561087a575b6020831081146103935782855290811561037757506001146108245750819003601f01601f191681019067ffffffffffffffff82118183101761030d57610309829182604052826108d7565b60035f9081529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b828210610864575060209150820101826102d9565b600181602092548385880101520191019061084f565b91607f16916107d8565b3461015e57602036600319011261015e576004359063ffffffff60e01b821680920361015e57602091637965db0b60e01b81149081156108c6575b5015158152f35b6301ffc9a760e01b149050836108bf565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361015e57565b602435906001600160a01b038216820361015e57565b6001600160a01b039081165f818152600160209081526040808320948616835293905291909120549291905f198410610967575b50505050565b8284106109d35780156109c0576001600160a01b038216156109ad575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f808080610961565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115610a82576001600160a01b03169182156105b657610a1e610d2a565b815f525f60205260405f2054818110610a6957815f80516020610d4683398151915292602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b634b637e8f60e11b5f525f60045260245ffd5b335f9081527fe09f975e15f8f53f24cbbc282b13c40b84df485fcdb8d3997fa103dc5a4ef841602052604090205460ff1615610acd57565b63e2517d3f60e01b5f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b5f81815260066020908152604080832033845290915290205460ff1615610b285750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f8181526006602090815260408083206001600160a01b038616845290915290205460ff16610bc4575f8181526006602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181526006602090815260408083206001600160a01b038616845290915290205460ff1615610bc4575f8181526006602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b9091906001600160a01b03168015610a8257610c68610d2a565b805f525f60205260405f2054838110610cad576020845f94955f80516020610d46833981519152938587528684520360408620558060025403600255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b6001600160a01b03169081156109c0576001600160a01b03169182156109ad5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60ff60055416610d3657565b63d93c066560e01b5f5260045ffdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202f9b86cfcf530bd9ec296a99086d465963963328007fa438d36ffe0648c4ecaf64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol b/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol index 68aff6651..d9b36219d 100644 --- a/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol +++ b/x/erc20/keeper/testdata/ERC20MaliciousDelayed.sol @@ -1,24 +1,48 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.20; -import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol"; // This is an evil token. Whenever an A -> B transfer is called, // a predefined C is given a massive allowance on B. -contract ERC20MaliciousDelayed is ERC20PresetMinterPauser { +contract ERC20MaliciousDelayed is ERC20, ERC20Burnable, ERC20Pausable, AccessControl { + bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + address private _thief = 0x4dC6ac40Af078661fc43823086E1513635Eeab14; uint256 private _bigNum = 1000000000000000000; // ~uint256(0) - constructor(uint256 initialSupply) - ERC20PresetMinterPauser("ERC20MaliciousDelayed", "ERC20MALICIOUSDELAYED") { - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - _mint(msg.sender, initialSupply); + constructor(uint256 initialSupply) ERC20("ERC20MaliciousDelayed", "ERC20MALICIOUSDELAYED") { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + _grantRole(MINTER_ROLE, msg.sender); + _grantRole(PAUSER_ROLE, msg.sender); + _mint(msg.sender, initialSupply); + } + + function pause() public onlyRole(PAUSER_ROLE) { + _pause(); + } + + function unpause() public onlyRole(PAUSER_ROLE) { + _unpause(); } + + function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) { + _mint(to, amount); + } + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { // Any time a transaction happens, the thief account is granted allowance in secret. // Still emits an Approve! - super._approve(recipient, _thief, _bigNum); + _approve(recipient, _thief, _bigNum); return super.transfer(recipient, amount); } + + function _update(address from, address to, uint256 value) internal override(ERC20, ERC20Pausable) { + super._update(from, to, value); + } } diff --git a/x/ibc/callbacks/testutil/CounterWithCallbacks.json b/x/ibc/callbacks/testutil/CounterWithCallbacks.json index 9b15d9a50..3236a7b28 100644 --- a/x/ibc/callbacks/testutil/CounterWithCallbacks.json +++ b/x/ibc/callbacks/testutil/CounterWithCallbacks.json @@ -1,5 +1,5 @@ { - "_format": "hh-sol-artifact-1", + "_format": "hh3-artifact-1", "contractName": "CounterWithCallbacks", "sourceName": "solidity/x/ibc/callbacks/testutil/CounterWithCallbacks.sol", "abi": [ @@ -282,8 +282,11 @@ "type": "function" } ], - "bytecode": "0x60808060405234610016576105dd908161001c8239f35b600080fdfe6040608081526004908136101561001557600080fd5b600090813560e01c80631f8ee6031461034f57806339b4073a1461024c57806345f2d105146101e857806361bc221a146102305780638ada066e14610230578063c489744b146101e8578063dbdf7fce146101ce5763f5d82b6b1461007957600080fd5b346101ca57806003193601126101ca576100916104e0565b6024359060018060a01b03169180516323b872dd60e01b81523386820152306024820152826044820152602090818160648189895af180156101c057610185575b506100dd855461050c565b855533855260018152818520848652815281852080549084820180921161017257907f9d572f819ae4f4b4839dda54bcb4cc8d7c2f0a67807db864716b20eafb51535993929155855482519081527fea6fcea9210b4226b3bb7e55ffa18bf072036d64073f5553336ee9bef303c2f0823392a2338652600181528186208587528152818620549082519485528401523392a380f35b634e487b7160e01b875260118852602487fd5b8181813d83116101b9575b61019a8183610435565b810103126101b55751801515036101b157386100d2565b8480fd5b8580fd5b503d610190565b83513d88823e3d90fd5b5080fd5b82346101e557806003193601126101e55780805580f35b80fd5b50346101ca57806003193601126101ca57806020926102056104e0565b61020d6104f6565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b50346101ca57816003193601126101ca57602091549051908152f35b50823461034b5760a036600319011261034b5767ffffffffffffffff9080358281116101b15761027f903690830161046d565b916024358181116101b557610297903690840161046d565b926102a06104c9565b90606435838111610347576102b8903690860161046d565b95608435918483116103435761032461030a6103046102fe7f42611285d4634f96d3f741584f4f896003f59253c3c7a40472cbf0053e726b5f996103319736910161046d565b93610562565b98610562565b988351968796168652606060208701526060860190610582565b9184830390850152610582565b0390a361033e815461050c565b815580f35b8880fd5b8780fd5b8280fd5b5082903461034b57608036600319011261034b5767ffffffffffffffff82358181116101b157610382903690850161046d565b6024358281116101b557610399903690860161046d565b916103a26104c9565b606435828111610347577f1e0d6d3f26f1ac738b3c50c77ac3e7931853b73d3c754eba1ec9ea2dfb0442c8936103f06103ea6103e46104079436908c0161046d565b92610562565b96610562565b968051948594168452806020850152830190610582565b0390a381549060001982019182136001166104225750815580f35b634e487b7160e01b835260119052602482fd5b90601f8019910116810190811067ffffffffffffffff82111761045757604052565b634e487b7160e01b600052604160045260246000fd5b81601f820112156104c45780359067ffffffffffffffff821161045757604051926104a2601f8401601f191660200185610435565b828452602083830101116104c457816000926020809301838601378301015290565b600080fd5b6044359067ffffffffffffffff821682036104c457565b600435906001600160a01b03821682036104c457565b602435906001600160a01b03821682036104c457565b906001820191600060018412911290801582169115161761052957565b634e487b7160e01b600052601160045260246000fd5b60005b8381106105525750506000910152565b8181015183820152602001610542565b61057a9060206040519282848094519384920161053f565b810103902090565b9060209161059b8151809281855285808601910161053f565b601f01601f191601019056fea2646970667358221220dbedd47e18fee307035f3e535245d5c88f15f8b2c71471301779b5234b00d88d64736f6c63430008140033", - "deployedBytecode": "0x6040608081526004908136101561001557600080fd5b600090813560e01c80631f8ee6031461034f57806339b4073a1461024c57806345f2d105146101e857806361bc221a146102305780638ada066e14610230578063c489744b146101e8578063dbdf7fce146101ce5763f5d82b6b1461007957600080fd5b346101ca57806003193601126101ca576100916104e0565b6024359060018060a01b03169180516323b872dd60e01b81523386820152306024820152826044820152602090818160648189895af180156101c057610185575b506100dd855461050c565b855533855260018152818520848652815281852080549084820180921161017257907f9d572f819ae4f4b4839dda54bcb4cc8d7c2f0a67807db864716b20eafb51535993929155855482519081527fea6fcea9210b4226b3bb7e55ffa18bf072036d64073f5553336ee9bef303c2f0823392a2338652600181528186208587528152818620549082519485528401523392a380f35b634e487b7160e01b875260118852602487fd5b8181813d83116101b9575b61019a8183610435565b810103126101b55751801515036101b157386100d2565b8480fd5b8580fd5b503d610190565b83513d88823e3d90fd5b5080fd5b82346101e557806003193601126101e55780805580f35b80fd5b50346101ca57806003193601126101ca57806020926102056104e0565b61020d6104f6565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b50346101ca57816003193601126101ca57602091549051908152f35b50823461034b5760a036600319011261034b5767ffffffffffffffff9080358281116101b15761027f903690830161046d565b916024358181116101b557610297903690840161046d565b926102a06104c9565b90606435838111610347576102b8903690860161046d565b95608435918483116103435761032461030a6103046102fe7f42611285d4634f96d3f741584f4f896003f59253c3c7a40472cbf0053e726b5f996103319736910161046d565b93610562565b98610562565b988351968796168652606060208701526060860190610582565b9184830390850152610582565b0390a361033e815461050c565b815580f35b8880fd5b8780fd5b8280fd5b5082903461034b57608036600319011261034b5767ffffffffffffffff82358181116101b157610382903690850161046d565b6024358281116101b557610399903690860161046d565b916103a26104c9565b606435828111610347577f1e0d6d3f26f1ac738b3c50c77ac3e7931853b73d3c754eba1ec9ea2dfb0442c8936103f06103ea6103e46104079436908c0161046d565b92610562565b96610562565b968051948594168452806020850152830190610582565b0390a381549060001982019182136001166104225750815580f35b634e487b7160e01b835260119052602482fd5b90601f8019910116810190811067ffffffffffffffff82111761045757604052565b634e487b7160e01b600052604160045260246000fd5b81601f820112156104c45780359067ffffffffffffffff821161045757604051926104a2601f8401601f191660200185610435565b828452602083830101116104c457816000926020809301838601378301015290565b600080fd5b6044359067ffffffffffffffff821682036104c457565b600435906001600160a01b03821682036104c457565b602435906001600160a01b03821682036104c457565b906001820191600060018412911290801582169115161761052957565b634e487b7160e01b600052601160045260246000fd5b60005b8381106105525750506000910152565b8181015183820152602001610542565b61057a9060206040519282848094519384920161053f565b810103902090565b9060209161059b8151809281855285808601910161053f565b601f01601f191601019056fea2646970667358221220dbedd47e18fee307035f3e535245d5c88f15f8b2c71471301779b5234b00d88d64736f6c63430008140033", + "bytecode": "0x6080806040523460155761059c908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80631f8ee6031461035f57806339b4073a1461024c57806345f2d105146101e057806361bc221a146102305780638ada066e14610230578063c489744b146101e0578063dbdf7fce146101cb5763f5d82b6b14610071575f80fd5b346101b45760403660031901126101b45761008a6104de565b6024359060018060a01b0316906040516323b872dd60e01b81523360048201523060248201528160448201526020816064815f875af180156101c057610188575b506100d65f5461054a565b5f55335f52600160205260405f20825f5260205260405f2080549082820180921161017457555f546040519081527fea6fcea9210b4226b3bb7e55ffa18bf072036d64073f5553336ee9bef303c2f060203392a2335f52600160205260405f20825f5260205260405f205460405191825260208201527f9d572f819ae4f4b4839dda54bcb4cc8d7c2f0a67807db864716b20eafb51535960403392a3005b634e487b7160e01b5f52601160045260245ffd5b6020813d6020116101b8575b816101a160209383610440565b810103126101b4575180151581146100cb575b5f80fd5b3d9150610194565b6040513d5f823e3d90fd5b346101b4575f3660031901126101b4575f8055005b346101b45760403660031901126101b4576101f96104de565b6102016104f4565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346101b4575f3660031901126101b45760205f54604051908152f35b346101b45760a03660031901126101b4576004356001600160401b0381116101b45761027c903690600401610475565b6024356001600160401b0381116101b45761029b903690600401610475565b6102a36104c8565b6064356001600160401b0381116101b4576102c2903690600401610475565b92608435916001600160401b0383116101b45761034e6001600160401b039261034061032561031f6103197f42611285d4634f96d3f741584f4f896003f59253c3c7a40472cbf0053e726b5f983690600401610475565b9361050a565b9761050a565b97604051958695168552606060208601526060850190610526565b908382036040850152610526565b0390a361035b5f5461054a565b5f55005b346101b45760803660031901126101b4576004356001600160401b0381116101b45761038f903690600401610475565b6024356001600160401b0381116101b4576103ae903690600401610475565b6103b66104c8565b6064356001600160401b0381116101b4577f1e0d6d3f26f1ac738b3c50c77ac3e7931853b73d3c754eba1ec9ea2dfb0442c89161042961040e61040861031f6001600160401b03953690600401610475565b9561050a565b95604051938493168352604060208401526040830190610526565b0390a35f545f198101908113600116610174575f55005b90601f801991011681019081106001600160401b0382111761046157604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156101b4576020813591016001600160401b03821161046157604051926104ac601f8401601f191660200185610440565b828452828201116101b457815f92602092838601378301015290565b604435906001600160401b03821682036101b457565b600435906001600160a01b03821682036101b457565b602435906001600160a01b03821682036101b457565b602090604051918183925191829101835e81015f815203902090565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9060018201915f6001841291129080158216911516176101745756fea264697066735822122035b02d7854e539c7fc975b2479a67435571c15842392d24eadddfe81ff84eb6f64736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c80631f8ee6031461035f57806339b4073a1461024c57806345f2d105146101e057806361bc221a146102305780638ada066e14610230578063c489744b146101e0578063dbdf7fce146101cb5763f5d82b6b14610071575f80fd5b346101b45760403660031901126101b45761008a6104de565b6024359060018060a01b0316906040516323b872dd60e01b81523360048201523060248201528160448201526020816064815f875af180156101c057610188575b506100d65f5461054a565b5f55335f52600160205260405f20825f5260205260405f2080549082820180921161017457555f546040519081527fea6fcea9210b4226b3bb7e55ffa18bf072036d64073f5553336ee9bef303c2f060203392a2335f52600160205260405f20825f5260205260405f205460405191825260208201527f9d572f819ae4f4b4839dda54bcb4cc8d7c2f0a67807db864716b20eafb51535960403392a3005b634e487b7160e01b5f52601160045260245ffd5b6020813d6020116101b8575b816101a160209383610440565b810103126101b4575180151581146100cb575b5f80fd5b3d9150610194565b6040513d5f823e3d90fd5b346101b4575f3660031901126101b4575f8055005b346101b45760403660031901126101b4576101f96104de565b6102016104f4565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346101b4575f3660031901126101b45760205f54604051908152f35b346101b45760a03660031901126101b4576004356001600160401b0381116101b45761027c903690600401610475565b6024356001600160401b0381116101b45761029b903690600401610475565b6102a36104c8565b6064356001600160401b0381116101b4576102c2903690600401610475565b92608435916001600160401b0383116101b45761034e6001600160401b039261034061032561031f6103197f42611285d4634f96d3f741584f4f896003f59253c3c7a40472cbf0053e726b5f983690600401610475565b9361050a565b9761050a565b97604051958695168552606060208601526060850190610526565b908382036040850152610526565b0390a361035b5f5461054a565b5f55005b346101b45760803660031901126101b4576004356001600160401b0381116101b45761038f903690600401610475565b6024356001600160401b0381116101b4576103ae903690600401610475565b6103b66104c8565b6064356001600160401b0381116101b4577f1e0d6d3f26f1ac738b3c50c77ac3e7931853b73d3c754eba1ec9ea2dfb0442c89161042961040e61040861031f6001600160401b03953690600401610475565b9561050a565b95604051938493168352604060208401526040830190610526565b0390a35f545f198101908113600116610174575f55005b90601f801991011681019081106001600160401b0382111761046157604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156101b4576020813591016001600160401b03821161046157604051926104ac601f8401601f191660200185610440565b828452828201116101b457815f92602092838601378301015290565b604435906001600160401b03821682036101b457565b600435906001600160a01b03821682036101b457565b602435906001600160a01b03821682036101b457565b602090604051918183925191829101835e81015f815203902090565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9060018201915f6001841291129080158216911516176101745756fea264697066735822122035b02d7854e539c7fc975b2479a67435571c15842392d24eadddfe81ff84eb6f64736f6c634300081a0033", "linkReferences": {}, - "deployedLinkReferences": {} -} + "deployedLinkReferences": {}, + "immutableReferences": {}, + "inputSourceName": "project/solidity/x/ibc/callbacks/testutil/CounterWithCallbacks.sol", + "buildInfoId": "solc-0_8_26-6ec4f0c6b3691526d7b3a3a19b37097670fc2b6e" +} \ No newline at end of file diff --git a/x/ibc/callbacks/testutil/CounterWithCallbacks.sol b/x/ibc/callbacks/testutil/CounterWithCallbacks.sol index ee9e5d487..ce46d056b 100644 --- a/x/ibc/callbacks/testutil/CounterWithCallbacks.sol +++ b/x/ibc/callbacks/testutil/CounterWithCallbacks.sol @@ -1,7 +1,7 @@ pragma solidity ^0.8.20; import "../../../../precompiles/callbacks/ICallbacks.sol"; -import "../../../../precompiles/erc20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract CounterWithCallbacks is ICallbacks { // State variables diff --git a/x/vm/keeper/state_transition.go b/x/vm/keeper/state_transition.go index 5f08c1bb2..36f759780 100644 --- a/x/vm/keeper/state_transition.go +++ b/x/vm/keeper/state_transition.go @@ -293,7 +293,12 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (_ err = k.PostTxProcessing(tmpCtx, signerAddr, *msg, receipt) if err != nil { // If hooks returns an error, revert the whole tx. - res.VmError = errorsmod.Wrap(err, "failed to execute post transaction processing").Error() + if rdp, ok := err.(types.RevertError); ok { + res.VmError = vm.ErrExecutionReverted.Error() + res.Ret = rdp.RevertData() + } else { + res.VmError = errorsmod.Wrap(err, "failed to execute post transaction processing").Error() + } k.Logger(ctx).Error("tx post processing failed", "error", err) // If the tx failed in post processing hooks, we should clear all log-related data // to match EVM behavior where transaction reverts clear all effects including logs diff --git a/x/vm/types/errors.go b/x/vm/types/errors.go index 007fa0540..657d30b04 100644 --- a/x/vm/types/errors.go +++ b/x/vm/types/errors.go @@ -126,8 +126,8 @@ func NewExecErrorWithReason(revertReason []byte) *RevertError { err = fmt.Errorf("execution reverted: %v", reason) } return &RevertError{ - error: err, - reason: hexutil.Encode(result), + error: err, + revertBytes: result, } } @@ -135,7 +135,7 @@ func NewExecErrorWithReason(revertReason []byte) *RevertError { // code and a binary data blob. type RevertError struct { error - reason string // revert reason hex encoded + revertBytes []byte } // ErrorCode returns the JSON error code for a revert. @@ -146,5 +146,16 @@ func (e *RevertError) ErrorCode() int { // ErrorData returns the hex encoded revert reason. func (e *RevertError) ErrorData() any { - return e.reason + if len(e.revertBytes) == 0 { + return "0x" + } + return hexutil.Encode(e.revertBytes) +} + +// RevertData returns the raw ABI revert payload (selector + calldata tail). +func (e *RevertError) RevertData() []byte { + if len(e.revertBytes) == 0 { + return nil + } + return common.CopyBytes(e.revertBytes) } diff --git a/x/vm/types/errors_test.go b/x/vm/types/errors_test.go index f2e173f88..48ce731b3 100644 --- a/x/vm/types/errors_test.go +++ b/x/vm/types/errors_test.go @@ -3,7 +3,9 @@ package types_test import ( "testing" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/require" "github.com/cosmos/evm/x/vm/types" @@ -40,6 +42,22 @@ func TestNewExecErrorWithReason(t *testing.T) { hexutil.MustDecode("0x08C379A00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000F434F554E5445525F544F4F5F4C4F570000000000000000000000000000000000"), "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000f434f554e5445525f544f4f5f4c4f570000000000000000000000000000000000", }, + { + "With known custom error (QueryFailed)", + "execution reverted", + func() []byte { + selector := crypto.Keccak256([]byte("QueryFailed(string,string)"))[:4] + stringTy, err := abi.NewType("string", "", nil) + require.NoError(t, err) + packed, packErr := abi.Arguments{{Type: stringTy}, {Type: stringTy}}.Pack("getClientState", "not found") + require.NoError(t, packErr) + out := make([]byte, 0, 4+len(packed)) + out = append(out, selector...) + out = append(out, packed...) + return out + }(), + "0xeb02196500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e676574436c69656e74537461746500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096e6f7420666f756e640000000000000000000000000000000000000000000000", + }, } for _, tc := range testCases {