diff --git a/packages/abi-gen-wrappers/CHANGELOG.json b/packages/abi-gen-wrappers/CHANGELOG.json index a764b56f1b..ed46526917 100644 --- a/packages/abi-gen-wrappers/CHANGELOG.json +++ b/packages/abi-gen-wrappers/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "5.3.0", + "changes": [ + { + "note": "Added DevUtils", + "pr": 2060 + } + ] + }, { "version": "5.2.0", "changes": [ diff --git a/packages/abi-gen-wrappers/package.json b/packages/abi-gen-wrappers/package.json index e76368d6f4..188bc9946d 100644 --- a/packages/abi-gen-wrappers/package.json +++ b/packages/abi-gen-wrappers/package.json @@ -22,7 +22,7 @@ "docs": "typedoc --excludePrivate --excludeExternals --target ES5 --tsconfig typedoc-tsconfig.json --out generated_docs ./src/generated-wrappers/*" }, "config": { - "abis": "../contract-artifacts/artifacts/@(AssetProxyOwner|DutchAuction|DummyERC20Token|DummyERC721Token|ERC20Proxy|ERC20Token|ERC721Proxy|ERC721Token|Exchange|Forwarder|IAssetProxy|IValidator|IWallet|MultiAssetProxy|OrderValidator|WETH9|ZRXToken|Coordinator|CoordinatorRegistry|EthBalanceChecker|ERC1155Proxy|StaticCallProxy).json" + "abis": "../contract-artifacts/artifacts/@(AssetProxyOwner|DevUtils|DutchAuction|DummyERC20Token|DummyERC721Token|ERC20Proxy|ERC20Token|ERC721Proxy|ERC721Token|Exchange|Forwarder|IAssetProxy|IValidator|IWallet|MultiAssetProxy|OrderValidator|WETH9|ZRXToken|Coordinator|CoordinatorRegistry|EthBalanceChecker|ERC1155Proxy|StaticCallProxy).json" }, "repository": { "type": "git", diff --git a/packages/abi-gen-wrappers/src/index.ts b/packages/abi-gen-wrappers/src/index.ts index 17af9d43d6..b9ec431af9 100644 --- a/packages/abi-gen-wrappers/src/index.ts +++ b/packages/abi-gen-wrappers/src/index.ts @@ -1,4 +1,5 @@ export * from './generated-wrappers/asset_proxy_owner'; +export * from './generated-wrappers/dev_utils'; export * from './generated-wrappers/dummy_erc20_token'; export * from './generated-wrappers/dummy_erc721_token'; export * from './generated-wrappers/dutch_auction'; diff --git a/packages/abi-gen/src/index.ts b/packages/abi-gen/src/index.ts index c11e9b0cf5..eca11ba217 100644 --- a/packages/abi-gen/src/index.ts +++ b/packages/abi-gen/src/index.ts @@ -181,7 +181,9 @@ function registerPythonHelpers(): void { Handlebars.registerHelper( 'makeReturnDocstringRole', (description: string, indent: number) => - new Handlebars.SafeString(utils.wrapPythonDocstringRole(`:returns: ${description}`, indent)), + new Handlebars.SafeString( + utils.wrapPythonDocstringRole(`:returns: ${description.replace(/ +/g, ' ')}`, indent), + ), ); Handlebars.registerHelper( 'makeEventParameterDocstringRole', diff --git a/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py b/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py index d61d7860f7..49bdb5bebd 100644 --- a/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py +++ b/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py @@ -456,7 +456,9 @@ class EcrecoverFnMethod(ContractMethod): :param s: ECDSA s output :param v: some v, recovery id :param tx_params: transaction parameters - :returns: the signerAddress that created this signature + :returns: the signerAddress that created this signature. this line too + is super long in order to demonstrate the proper hanging + indentation in generated code. """ (_hash, v, r, s) = self.validate_and_normalize_inputs(_hash, v, r, s) tx_params = super().normalize_tx_params(tx_params) @@ -475,7 +477,9 @@ class EcrecoverFnMethod(ContractMethod): :param s: ECDSA s output :param v: some v, recovery id :param tx_params: transaction parameters - :returns: the signerAddress that created this signature + :returns: the signerAddress that created this signature. this line too + is super long in order to demonstrate the proper hanging + indentation in generated code. """ (_hash, v, r, s) = self.validate_and_normalize_inputs(_hash, v, r, s) tx_params = super().normalize_tx_params(tx_params) @@ -1616,7 +1620,7 @@ class AbiGenDummy: def abi(): """Return the ABI to the underlying contract.""" return json.loads( - '[{"constant":true,"inputs":[],"name":"simpleRequire","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"bytes[]"}],"name":"acceptsAnArrayOfBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"index_0","type":"uint256"}],"name":"simpleInputSimpleOutput","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index_0","type":"uint256"},{"name":"index_1","type":"bytes"},{"name":"index_2","type":"string"}],"name":"multiInputMultiOutput","outputs":[{"name":"","type":"bytes"},{"name":"","type":"bytes"},{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"ecrecoverFn","outputs":[{"name":"signerAddress","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"bytes"}],"name":"acceptsBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"noInputSimpleOutput","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"revertWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"simpleRevert","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"methodUsingNestedStructWithInnerStructNotUsedElsewhere","outputs":[{"components":[{"components":[{"name":"aField","type":"uint256"}],"name":"innerStruct","type":"tuple"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"nestedStructOutput","outputs":[{"components":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"innerStruct","type":"tuple"},{"name":"description","type":"string"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"requireWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"address"},{"name":"a","type":"uint256"},{"name":"b","type":"uint256"},{"name":"y","type":"address"},{"name":"c","type":"uint256"}],"name":"withAddressInput","outputs":[{"name":"z","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"s","type":"tuple"}],"name":"structInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"foo","type":"uint256"},{"name":"bar","type":"bytes"},{"name":"car","type":"string"}],"name":"complexInput","type":"tuple"}],"name":"complexInputComplexOutput","outputs":[{"components":[{"components":[{"name":"foo","type":"uint256"},{"name":"bar","type":"bytes"},{"name":"car","type":"string"}],"name":"input","type":"tuple"},{"name":"lorem","type":"bytes"},{"name":"ipsum","type":"bytes"},{"name":"dolor","type":"string"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"noInputNoOutput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"}],"name":"simplePureFunctionWithInput","outputs":[{"name":"sum","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethodThatReturnsNothing","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"simplePureFunction","outputs":[{"name":"result","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"innerStruct","type":"tuple"},{"name":"description","type":"string"}],"name":"n","type":"tuple"}],"name":"nestedStructInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"methodReturningMultipleValues","outputs":[{"name":"","type":"uint256"},{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"methodReturningArrayOfStructs","outputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"","type":"tuple[]"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"structOutput","outputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"s","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"pureFunctionWithConstant","outputs":[{"name":"someConstant","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"index_0","type":"uint256"}],"name":"simpleInputNoOutput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"string"}],"name":"overloadedMethod","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"int256"}],"name":"overloadedMethod","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"param","type":"uint8"}],"name":"AnEvent","type":"event"}]' # noqa: E501 (line-too-long) + '[{"constant":true,"inputs":[],"name":"simpleRequire","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes[]","name":"a","type":"bytes[]"}],"name":"acceptsAnArrayOfBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index_0","type":"uint256"}],"name":"simpleInputSimpleOutput","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index_0","type":"uint256"},{"internalType":"bytes","name":"index_1","type":"bytes"},{"internalType":"string","name":"index_2","type":"string"}],"name":"multiInputMultiOutput","outputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ecrecoverFn","outputs":[{"internalType":"address","name":"signerAddress","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"a","type":"bytes"}],"name":"acceptsBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"noInputSimpleOutput","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"revertWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"simpleRevert","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"methodUsingNestedStructWithInnerStructNotUsedElsewhere","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"aField","type":"uint256"}],"internalType":"struct AbiGenDummy.StructNotDirectlyUsedAnywhere","name":"innerStruct","type":"tuple"}],"internalType":"struct AbiGenDummy.NestedStructWithInnerStructNotUsedElsewhere","name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"nestedStructOutput","outputs":[{"components":[{"components":[{"internalType":"bytes","name":"someBytes","type":"bytes"},{"internalType":"uint32","name":"anInteger","type":"uint32"},{"internalType":"bytes[]","name":"aDynamicArrayOfBytes","type":"bytes[]"},{"internalType":"string","name":"aString","type":"string"}],"internalType":"struct AbiGenDummy.Struct","name":"innerStruct","type":"tuple"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct AbiGenDummy.NestedStruct","name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"requireWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"x","type":"address"},{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"},{"internalType":"address","name":"y","type":"address"},{"internalType":"uint256","name":"c","type":"uint256"}],"name":"withAddressInput","outputs":[{"internalType":"address","name":"z","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"internalType":"bytes","name":"someBytes","type":"bytes"},{"internalType":"uint32","name":"anInteger","type":"uint32"},{"internalType":"bytes[]","name":"aDynamicArrayOfBytes","type":"bytes[]"},{"internalType":"string","name":"aString","type":"string"}],"internalType":"struct AbiGenDummy.Struct","name":"s","type":"tuple"}],"name":"structInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"components":[{"internalType":"uint256","name":"foo","type":"uint256"},{"internalType":"bytes","name":"bar","type":"bytes"},{"internalType":"string","name":"car","type":"string"}],"internalType":"struct AbiGenDummy.ComplexInput","name":"complexInput","type":"tuple"}],"name":"complexInputComplexOutput","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"foo","type":"uint256"},{"internalType":"bytes","name":"bar","type":"bytes"},{"internalType":"string","name":"car","type":"string"}],"internalType":"struct AbiGenDummy.ComplexInput","name":"input","type":"tuple"},{"internalType":"bytes","name":"lorem","type":"bytes"},{"internalType":"bytes","name":"ipsum","type":"bytes"},{"internalType":"string","name":"dolor","type":"string"}],"internalType":"struct AbiGenDummy.ComplexOutput","name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"noInputNoOutput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"simplePureFunctionWithInput","outputs":[{"internalType":"uint256","name":"sum","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethodThatReturnsNothing","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"simplePureFunction","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"internalType":"bytes","name":"someBytes","type":"bytes"},{"internalType":"uint32","name":"anInteger","type":"uint32"},{"internalType":"bytes[]","name":"aDynamicArrayOfBytes","type":"bytes[]"},{"internalType":"string","name":"aString","type":"string"}],"internalType":"struct AbiGenDummy.Struct","name":"innerStruct","type":"tuple"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct AbiGenDummy.NestedStruct","name":"n","type":"tuple"}],"name":"nestedStructInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"methodReturningMultipleValues","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"methodReturningArrayOfStructs","outputs":[{"components":[{"internalType":"bytes","name":"someBytes","type":"bytes"},{"internalType":"uint32","name":"anInteger","type":"uint32"},{"internalType":"bytes[]","name":"aDynamicArrayOfBytes","type":"bytes[]"},{"internalType":"string","name":"aString","type":"string"}],"internalType":"struct AbiGenDummy.Struct[]","name":"","type":"tuple[]"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"structOutput","outputs":[{"components":[{"internalType":"bytes","name":"someBytes","type":"bytes"},{"internalType":"uint32","name":"anInteger","type":"uint32"},{"internalType":"bytes[]","name":"aDynamicArrayOfBytes","type":"bytes[]"},{"internalType":"string","name":"aString","type":"string"}],"internalType":"struct AbiGenDummy.Struct","name":"s","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"pureFunctionWithConstant","outputs":[{"internalType":"uint256","name":"someConstant","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index_0","type":"uint256"}],"name":"simpleInputNoOutput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"a","type":"string"}],"name":"overloadedMethod","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"int256","name":"a","type":"int256"}],"name":"overloadedMethod","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"param","type":"uint8"}],"name":"AnEvent","type":"event"}]' # noqa: E501 (line-too-long) ) # pylint: disable=too-many-lines diff --git a/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts b/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts index 69c45ace05..96a438bd83 100644 --- a/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts +++ b/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts @@ -496,7 +496,7 @@ export class AbiGenDummyContract extends BaseContract { * @param v some v, recovery id * @param r ECDSA r output * @param s ECDSA s output - * @returns the signerAddress that created this signature + * @returns the signerAddress that created this signature. this line too is super long in order to demonstrate the proper hanging indentation in generated code. */ async callAsync( hash: string, diff --git a/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json b/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json index 7b3343dd17..9417155dc1 100644 --- a/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json +++ b/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json @@ -16,6 +16,7 @@ "constant": true, "inputs": [ { + "internalType": "bytes[]", "name": "a", "type": "bytes[]" } @@ -30,6 +31,7 @@ "constant": true, "inputs": [ { + "internalType": "uint256", "name": "", "type": "uint256" } @@ -37,6 +39,7 @@ "name": "simpleInputSimpleOutput", "outputs": [ { + "internalType": "uint256", "name": "", "type": "uint256" } @@ -49,6 +52,7 @@ "constant": false, "inputs": [ { + "internalType": "uint256", "name": "wad", "type": "uint256" } @@ -63,14 +67,17 @@ "constant": true, "inputs": [ { + "internalType": "uint256", "name": "", "type": "uint256" }, { + "internalType": "bytes", "name": "", "type": "bytes" }, { + "internalType": "string", "name": "", "type": "string" } @@ -78,14 +85,17 @@ "name": "multiInputMultiOutput", "outputs": [ { + "internalType": "bytes", "name": "", "type": "bytes" }, { + "internalType": "bytes", "name": "", "type": "bytes" }, { + "internalType": "string", "name": "", "type": "string" } @@ -98,18 +108,22 @@ "constant": true, "inputs": [ { + "internalType": "bytes32", "name": "hash", "type": "bytes32" }, { + "internalType": "uint8", "name": "v", "type": "uint8" }, { + "internalType": "bytes32", "name": "r", "type": "bytes32" }, { + "internalType": "bytes32", "name": "s", "type": "bytes32" } @@ -117,6 +131,7 @@ "name": "ecrecoverFn", "outputs": [ { + "internalType": "address", "name": "signerAddress", "type": "address" } @@ -129,6 +144,7 @@ "constant": true, "inputs": [ { + "internalType": "bytes", "name": "a", "type": "bytes" } @@ -145,6 +161,7 @@ "name": "noInputSimpleOutput", "outputs": [ { + "internalType": "uint256", "name": "", "type": "uint256" } @@ -181,14 +198,17 @@ { "components": [ { + "internalType": "uint256", "name": "aField", "type": "uint256" } ], + "internalType": "struct AbiGenDummy.StructNotDirectlyUsedAnywhere", "name": "innerStruct", "type": "tuple" } ], + "internalType": "struct AbiGenDummy.NestedStructWithInnerStructNotUsedElsewhere", "name": "", "type": "tuple" } @@ -207,30 +227,37 @@ { "components": [ { + "internalType": "bytes", "name": "someBytes", "type": "bytes" }, { + "internalType": "uint32", "name": "anInteger", "type": "uint32" }, { + "internalType": "bytes[]", "name": "aDynamicArrayOfBytes", "type": "bytes[]" }, { + "internalType": "string", "name": "aString", "type": "string" } ], + "internalType": "struct AbiGenDummy.Struct", "name": "innerStruct", "type": "tuple" }, { + "internalType": "string", "name": "description", "type": "string" } ], + "internalType": "struct AbiGenDummy.NestedStruct", "name": "", "type": "tuple" } @@ -252,22 +279,27 @@ "constant": true, "inputs": [ { + "internalType": "address", "name": "x", "type": "address" }, { + "internalType": "uint256", "name": "a", "type": "uint256" }, { + "internalType": "uint256", "name": "b", "type": "uint256" }, { + "internalType": "address", "name": "y", "type": "address" }, { + "internalType": "uint256", "name": "c", "type": "uint256" } @@ -275,6 +307,7 @@ "name": "withAddressInput", "outputs": [ { + "internalType": "address", "name": "z", "type": "address" } @@ -289,22 +322,27 @@ { "components": [ { + "internalType": "bytes", "name": "someBytes", "type": "bytes" }, { + "internalType": "uint32", "name": "anInteger", "type": "uint32" }, { + "internalType": "bytes[]", "name": "aDynamicArrayOfBytes", "type": "bytes[]" }, { + "internalType": "string", "name": "aString", "type": "string" } ], + "internalType": "struct AbiGenDummy.Struct", "name": "s", "type": "tuple" } @@ -321,6 +359,7 @@ "name": "nonPureMethod", "outputs": [ { + "internalType": "uint256", "name": "", "type": "uint256" } @@ -335,18 +374,22 @@ { "components": [ { + "internalType": "uint256", "name": "foo", "type": "uint256" }, { + "internalType": "bytes", "name": "bar", "type": "bytes" }, { + "internalType": "string", "name": "car", "type": "string" } ], + "internalType": "struct AbiGenDummy.ComplexInput", "name": "complexInput", "type": "tuple" } @@ -358,34 +401,42 @@ { "components": [ { + "internalType": "uint256", "name": "foo", "type": "uint256" }, { + "internalType": "bytes", "name": "bar", "type": "bytes" }, { + "internalType": "string", "name": "car", "type": "string" } ], + "internalType": "struct AbiGenDummy.ComplexInput", "name": "input", "type": "tuple" }, { + "internalType": "bytes", "name": "lorem", "type": "bytes" }, { + "internalType": "bytes", "name": "ipsum", "type": "bytes" }, { + "internalType": "string", "name": "dolor", "type": "string" } ], + "internalType": "struct AbiGenDummy.ComplexOutput", "name": "", "type": "tuple" } @@ -407,6 +458,7 @@ "constant": true, "inputs": [ { + "internalType": "uint256", "name": "x", "type": "uint256" } @@ -414,6 +466,7 @@ "name": "simplePureFunctionWithInput", "outputs": [ { + "internalType": "uint256", "name": "sum", "type": "uint256" } @@ -437,6 +490,7 @@ "name": "simplePureFunction", "outputs": [ { + "internalType": "uint256", "name": "result", "type": "uint256" } @@ -453,30 +507,37 @@ { "components": [ { + "internalType": "bytes", "name": "someBytes", "type": "bytes" }, { + "internalType": "uint32", "name": "anInteger", "type": "uint32" }, { + "internalType": "bytes[]", "name": "aDynamicArrayOfBytes", "type": "bytes[]" }, { + "internalType": "string", "name": "aString", "type": "string" } ], + "internalType": "struct AbiGenDummy.Struct", "name": "innerStruct", "type": "tuple" }, { + "internalType": "string", "name": "description", "type": "string" } ], + "internalType": "struct AbiGenDummy.NestedStruct", "name": "n", "type": "tuple" } @@ -493,10 +554,12 @@ "name": "methodReturningMultipleValues", "outputs": [ { + "internalType": "uint256", "name": "", "type": "uint256" }, { + "internalType": "string", "name": "", "type": "string" } @@ -513,22 +576,27 @@ { "components": [ { + "internalType": "bytes", "name": "someBytes", "type": "bytes" }, { + "internalType": "uint32", "name": "anInteger", "type": "uint32" }, { + "internalType": "bytes[]", "name": "aDynamicArrayOfBytes", "type": "bytes[]" }, { + "internalType": "string", "name": "aString", "type": "string" } ], + "internalType": "struct AbiGenDummy.Struct[]", "name": "", "type": "tuple[]" } @@ -545,22 +613,27 @@ { "components": [ { + "internalType": "bytes", "name": "someBytes", "type": "bytes" }, { + "internalType": "uint32", "name": "anInteger", "type": "uint32" }, { + "internalType": "bytes[]", "name": "aDynamicArrayOfBytes", "type": "bytes[]" }, { + "internalType": "string", "name": "aString", "type": "string" } ], + "internalType": "struct AbiGenDummy.Struct", "name": "s", "type": "tuple" } @@ -575,6 +648,7 @@ "name": "pureFunctionWithConstant", "outputs": [ { + "internalType": "uint256", "name": "someConstant", "type": "uint256" } @@ -587,6 +661,7 @@ "constant": true, "inputs": [ { + "internalType": "uint256", "name": "", "type": "uint256" } @@ -601,6 +676,7 @@ "constant": true, "inputs": [ { + "internalType": "string", "name": "a", "type": "string" } @@ -615,6 +691,7 @@ "constant": true, "inputs": [ { + "internalType": "int256", "name": "a", "type": "int256" } @@ -630,11 +707,13 @@ "inputs": [ { "indexed": true, + "internalType": "address", "name": "_owner", "type": "address" }, { "indexed": false, + "internalType": "uint256", "name": "_value", "type": "uint256" } @@ -647,6 +726,7 @@ "inputs": [ { "indexed": false, + "internalType": "uint8", "name": "param", "type": "uint8" } @@ -674,7 +754,7 @@ "s": "ECDSA s output", "v": "some v, recovery id" }, - "return": "the signerAddress that created this signature" + "return": "the signerAddress that created this signature. this line too is super long in order to demonstrate the proper hanging indentation in generated code." }, "multiInputMultiOutput(uint256,bytes,string)": { "details": "Tests decoding when the input and output are complex and have more than one argument." @@ -700,15 +780,15 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b506113c2806100206000396000f3fe608060405234801561001057600080fd5b50600436106101ce5760003560e01c8063647341eb11610104578063ae2dae17116100a2578063d88be12f11610071578063d88be12f14610388578063ee8b86fb14610390578063f408fb311461026e578063fa315f9d146103a3576101ce565b8063ae2dae171461033a578063bb60736214610348578063bdab16881461035e578063d6d7618c14610373576101ce565b80637a791e6e116100de5780637a791e6e1461030f5780638ee52b4e146103175780639a3b61851461032a578063a3c2f6b614610332576101ce565b8063647341eb146102d957806376f15d5b146102e75780637833bec0146102ef576101ce565b80634303a54211610171578063586f84b21161014b578063586f84b21461029457806359c28add146102a95780635ba3c7c0146102be57806363d69c88146102c6576101ce565b80634303a5421461027c5780634582eab21461028457806345fdbdb71461028c576101ce565b80632e1a7d4d116101ad5780632e1a7d4d146102195780633687617d1461022c57806336b323961461024e5780633e9ef66a1461026e576101ce565b806209e437146101d35780630527c28f146101dd5780631310e444146101f0575b600080fd5b6101db6103b1565b005b6101db6101eb366004610c35565b6103ee565b6102036101fe366004610cea565b6103f1565b60405161021091906112e4565b60405180910390f35b6101db610227366004610cea565b6103f8565b61023f61023a366004610e62565b610449565b604051610210939291906110b9565b61026161025c366004610c72565b6104e9565b6040516102109190610ffb565b6101db6101eb366004610cb5565b6102036105cb565b6101db6105d2565b6101db610637565b61029c610669565b604051610210919061126f565b6102b1610671565b604051610210919061127a565b6101db610679565b6102616102d4366004610be3565b6106de565b6101db6101eb366004610e2d565b6102036106e7565b6103026102fd366004610d03565b6106f5565b6040516102109190611183565b6101db6107b2565b610203610325366004610cea565b6107b7565b6101db6107bd565b6102036107c8565b6101db6101eb366004610d9d565b6103506107cd565b6040516102109291906112ed565b610366610806565b604051610210919061101c565b61037b61080b565b60405161021091906112d1565b610203610964565b6101db61039e366004610cea565b6101eb565b6101db6101eb366004610cea565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e39061114c565b60405180910390fd5b565b50565b506107c790565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658260405161043e91906112e4565b60405180910390a250565b505060408051808201825260048082527f1234567800000000000000000000000000000000000000000000000000000000602080840191909152835180850185528281527f87654321000000000000000000000000000000000000000000000000000000008183015284518086019095529184527f616d657400000000000000000000000000000000000000000000000000000000908401529093909250565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090506000818760405160200161053a929190610fd9565b60405160208183030381529060405280519060200120905060018187878760405160008152602001604052604051610575949392919061109b565b6020604051602081039080840390855afa158015610597573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b6107c75b90565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526103e391906004016110fb565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e390611115565b6105cf61096a565b6105cf610982565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526103e391906004016110fb565b50929392505050565b600080546001019081905590565b6106fd6109a2565b50604080516080810182529182528051808201825260048082527f123456780000000000000000000000000000000000000000000000000000000060208381019190915280850192909252825180840184528181527f87654321000000000000000000000000000000000000000000000000000000008184015284840152825180840190935282527f616d65740000000000000000000000000000000000000000000000000000000090820152606082015290565b6103ec565b60010190565b600080546001019055565b600190565b60408051808201909152600581527f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152600191565b606090565b6108136109d0565b6040805160028082526060828101909352816020015b60608152602001906001900390816108295790505090506040518060400160405280600581526020017f30783132330000000000000000000000000000000000000000000000000000008152508160008151811061088357fe5b60200260200101819052506040518060400160405280600581526020017f3078333231000000000000000000000000000000000000000000000000000000815250816001815181106108d157fe5b6020908102919091018101919091526040805160c0810182526005608082018181527f307831323300000000000000000000000000000000000000000000000000000060a0840152825281840152808201939093528051808201909152600381527f6162630000000000000000000000000000000000000000000000000000000000918101919091526060820152905090565b6104d290565b604051806020016040528061097d6109fe565b905290565b6040518060a001604052806109956109d0565b8152602001606081525090565b6040518060c001604052806109b5610a11565b81526020016060815260200160608152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b6040518060200160405280600081525090565b60405180606001604052806000815260200160608152602001606081525090565b600082601f830112610a42578081fd5b813567ffffffffffffffff811115610a58578182fd5b6020610a678182840201611306565b828152925080830184820160005b84811015610a9e57610a8c888584358a0101610aa9565b83529183019190830190600101610a75565b505050505092915050565b600082601f830112610ab9578081fd5b813567ffffffffffffffff811115610acf578182fd5b610b0060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611306565b9150808252836020828501011115610b1757600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610b41578081fd5b610b4b6080611306565b90506000823567ffffffffffffffff80821115610b66578283fd5b610b7286838701610aa9565b84526020850135915063ffffffff82168214610b8c578283fd5b8160208501526040850135915080821115610ba5578283fd5b610bb186838701610a32565b60408501526060850135915080821115610bc9578283fd5b50610bd685828601610aa9565b6060840152505092915050565b600080600080600060a08688031215610bfb57600080fd5b8535610c068161135d565b945060208601359350604086013592506060860135610c248161135d565b949793965091946080013592915050565b600060208284031215610c4757600080fd5b813567ffffffffffffffff811115610c5e57600080fd5b610c6a84828501610a32565b949350505050565b60008060008060808587031215610c8857600080fd5b84359350602085013560ff81168114610ca057600080fd5b93969395505050506040820135916060013590565b600060208284031215610cc757600080fd5b813567ffffffffffffffff811115610cde57600080fd5b610c6a84828501610aa9565b600060208284031215610cfc57600080fd5b5035919050565b600060208284031215610d14578081fd5b813567ffffffffffffffff80821115610d2b578283fd5b81840160608187031215610d3d578384fd5b610d476060611306565b925080358352602081013582811115610d5e578485fd5b610d6a87828401610aa9565b602085015250604081013582811115610d81578485fd5b610d8d87828401610aa9565b6040850152509195945050505050565b600060208284031215610dae578081fd5b813567ffffffffffffffff80821115610dc5578283fd5b81840160408187031215610dd7578384fd5b610de16040611306565b9250803582811115610df1578485fd5b610dfd87828401610b30565b845250602081013582811115610e11578485fd5b610e1d87828401610aa9565b6020850152509195945050505050565b600060208284031215610e3f57600080fd5b813567ffffffffffffffff811115610e5657600080fd5b610c6a84828501610b30565b600080600060608486031215610e76578081fd5b83359250602084013567ffffffffffffffff80821115610e94578283fd5b610ea087838801610aa9565b93506040860135915080821115610eb5578283fd5b50610ec286828701610aa9565b9150509250925092565b60008151808452610ee481602086016020860161132d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815160808452610f2b6080850182610ecc565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b82851015610fb2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868303018452610f9e828251610ecc565b600195909501949387019391508601610f64565b506060880151955088810360608a0152610fcc8187610ecc565b9998505050505050505050565b60008351610feb81846020880161132d565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208083018184528085518083526040860191506040848202870101925083870160005b8281101561108e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261107c858351610f16565b94509285019290850190600101611042565b5092979650505050505050565b93845260ff9290921660208401526040830152606082015260800190565b6000606082526110cc6060830186610ecc565b82810360208401526110de8186610ecc565b83810360408501526110f08186610ecc565b979650505050505050565b60006020825261110e6020830184610ecc565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160806020840152805160a08401526020810151606060c08501526111b3610100850182610ecc565b604083015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608582030160e08601526111ee8183610ecc565b9250505060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301604086015261122c8383610ecc565b60408701519350818682030160608701526112478185610ecc565b9250506060860151925080858303016080860152506112668183610ecc565b95945050505050565b905151815260200190565b6000602082528251604060208401526112966060840182610f16565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526112668183610ecc565b60006020825261110e6020830184610f16565b90815260200190565b600083825260406020830152610c6a6040830184610ecc565b60405181810167ffffffffffffffff8111828210171561132557600080fd5b604052919050565b60005b83811015611348578181015183820152602001611330565b83811115611357576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103ee57600080fdfea365627a7a72305820f18aec824fbe25f825f6bee7834c12b23c470fc5917be3638390693d92ccd0336c6578706572696d656e74616cf564736f6c634300050a0040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13C2 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1CE JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x647341EB GT PUSH2 0x104 JUMPI DUP1 PUSH4 0xAE2DAE17 GT PUSH2 0xA2 JUMPI DUP1 PUSH4 0xD88BE12F GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x388 JUMPI DUP1 PUSH4 0xEE8B86FB EQ PUSH2 0x390 JUMPI DUP1 PUSH4 0xF408FB31 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0xFA315F9D EQ PUSH2 0x3A3 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x33A JUMPI DUP1 PUSH4 0xBB607362 EQ PUSH2 0x348 JUMPI DUP1 PUSH4 0xBDAB1688 EQ PUSH2 0x35E JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x373 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x7A791E6E GT PUSH2 0xDE JUMPI DUP1 PUSH4 0x7A791E6E EQ PUSH2 0x30F JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x317 JUMPI DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x32A JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x332 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x647341EB EQ PUSH2 0x2D9 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0x7833BEC0 EQ PUSH2 0x2EF JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x4303A542 GT PUSH2 0x171 JUMPI DUP1 PUSH4 0x586F84B2 GT PUSH2 0x14B JUMPI DUP1 PUSH4 0x586F84B2 EQ PUSH2 0x294 JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x2A9 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x2C6 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x4303A542 EQ PUSH2 0x27C JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x284 JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x28C JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x2E1A7D4D GT PUSH2 0x1AD JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x219 JUMPI DUP1 PUSH4 0x3687617D EQ PUSH2 0x22C JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x24E JUMPI DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x26E JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x1D3 JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x1DD JUMPI DUP1 PUSH4 0x1310E444 EQ PUSH2 0x1F0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DB PUSH2 0x3B1 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xC35 JUMP JUMPDEST PUSH2 0x3EE JUMP JUMPDEST PUSH2 0x203 PUSH2 0x1FE CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x3F1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x12E4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1DB PUSH2 0x227 CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x3F8 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x23A CALLDATASIZE PUSH1 0x4 PUSH2 0xE62 JUMP JUMPDEST PUSH2 0x449 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x10B9 JUMP JUMPDEST PUSH2 0x261 PUSH2 0x25C CALLDATASIZE PUSH1 0x4 PUSH2 0xC72 JUMP JUMPDEST PUSH2 0x4E9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0xFFB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xCB5 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x5CB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x5D2 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x637 JUMP JUMPDEST PUSH2 0x29C PUSH2 0x669 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x126F JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x671 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x127A JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x679 JUMP JUMPDEST PUSH2 0x261 PUSH2 0x2D4 CALLDATASIZE PUSH1 0x4 PUSH2 0xBE3 JUMP JUMPDEST PUSH2 0x6DE JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xE2D JUMP JUMPDEST PUSH2 0x203 PUSH2 0x6E7 JUMP JUMPDEST PUSH2 0x302 PUSH2 0x2FD CALLDATASIZE PUSH1 0x4 PUSH2 0xD03 JUMP JUMPDEST PUSH2 0x6F5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x1183 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x7B2 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x325 CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x7B7 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x7BD JUMP JUMPDEST PUSH2 0x203 PUSH2 0x7C8 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xD9D JUMP JUMPDEST PUSH2 0x350 PUSH2 0x7CD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP3 SWAP2 SWAP1 PUSH2 0x12ED JUMP JUMPDEST PUSH2 0x366 PUSH2 0x806 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x101C JUMP JUMPDEST PUSH2 0x37B PUSH2 0x80B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x12D1 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x964 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x39E CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x1EB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E3 SWAP1 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST POP JUMP JUMPDEST POP PUSH2 0x7C7 SWAP1 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD PUSH2 0x43E SWAP2 SWAP1 PUSH2 0x12E4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE DUP3 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP4 ADD MSTORE DUP5 MLOAD DUP1 DUP7 ADD SWAP1 SWAP6 MSTORE SWAP2 DUP5 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP5 ADD MSTORE SWAP1 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x53A SWAP3 SWAP2 SWAP1 PUSH2 0xFD9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x575 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x109B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x597 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x7C7 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x3E3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x10FB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E3 SWAP1 PUSH2 0x1115 JUMP JUMPDEST PUSH2 0x5CF PUSH2 0x96A JUMP JUMPDEST PUSH2 0x5CF PUSH2 0x982 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x3E3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x10FB JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH2 0x6FD PUSH2 0x9A2 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE SWAP2 DUP3 MSTORE DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 MLOAD DUP1 DUP5 ADD DUP5 MSTORE DUP2 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP5 ADD MSTORE DUP5 DUP5 ADD MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP3 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x3EC JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x68656C6C6F000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1 SWAP2 JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH2 0x813 PUSH2 0x9D0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 DUP2 ADD SWAP1 SWAP4 MSTORE DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x829 JUMPI SWAP1 POP POP SWAP1 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3078313233000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x883 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3078333231000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x8D1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x5 PUSH1 0x80 DUP3 ADD DUP2 DUP2 MSTORE PUSH32 0x3078313233000000000000000000000000000000000000000000000000000000 PUSH1 0xA0 DUP5 ADD MSTORE DUP3 MSTORE DUP2 DUP5 ADD MSTORE DUP1 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x6162630000000000000000000000000000000000000000000000000000000000 SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MSTORE SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x97D PUSH2 0x9FE JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x995 PUSH2 0x9D0 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x9B5 PUSH2 0xA11 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xA42 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xA58 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0xA67 DUP2 DUP3 DUP5 MUL ADD PUSH2 0x1306 JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xA9E JUMPI PUSH2 0xA8C DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0xAA9 JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xA75 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xAB9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xACF JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xB00 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1306 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xB17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB41 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xB4B PUSH1 0x80 PUSH2 0x1306 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xB66 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xB72 DUP7 DUP4 DUP8 ADD PUSH2 0xAA9 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0xB8C JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xBA5 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xBB1 DUP7 DUP4 DUP8 ADD PUSH2 0xA32 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xBC9 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xBD6 DUP6 DUP3 DUP7 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xBFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0xC06 DUP2 PUSH2 0x135D JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0xC24 DUP2 PUSH2 0x135D JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xC47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xC5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xA32 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xC88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xCA0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xCDE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD14 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xD2B JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x60 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xD3D JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xD47 PUSH1 0x60 PUSH2 0x1306 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xD5E JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xD6A DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xD81 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xD8D DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xDAE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xDC5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xDD7 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xDE1 PUSH1 0x40 PUSH2 0x1306 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xDF1 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xDFD DUP8 DUP3 DUP5 ADD PUSH2 0xB30 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xE11 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xE1D DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xB30 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xE76 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xE94 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xEA0 DUP8 DUP4 DUP9 ADD PUSH2 0xAA9 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xEB5 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xEC2 DUP7 DUP3 DUP8 ADD PUSH2 0xAA9 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0xEE4 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x132D JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0xF2B PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0xFB2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0xF9E DUP3 DUP3 MLOAD PUSH2 0xECC JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0xF64 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0xFCC DUP2 DUP8 PUSH2 0xECC JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0xFEB DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x132D JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x108E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x107C DUP6 DUP4 MLOAD PUSH2 0xF16 JUMP JUMPDEST SWAP5 POP SWAP3 DUP6 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1042 JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0x10CC PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0xECC JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x10DE DUP2 DUP7 PUSH2 0xECC JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x10F0 DUP2 DUP7 PUSH2 0xECC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x110E PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xECC JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE DUP1 MLOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x60 PUSH1 0xC0 DUP6 ADD MSTORE PUSH2 0x11B3 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 DUP6 DUP3 SUB ADD PUSH1 0xE0 DUP7 ADD MSTORE PUSH2 0x11EE DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST SWAP3 POP POP POP PUSH1 0x20 DUP5 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP1 DUP6 DUP5 SUB ADD PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x122C DUP4 DUP4 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD SWAP4 POP DUP2 DUP7 DUP3 SUB ADD PUSH1 0x60 DUP8 ADD MSTORE PUSH2 0x1247 DUP2 DUP6 PUSH2 0xECC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP7 ADD MLOAD SWAP3 POP DUP1 DUP6 DUP4 SUB ADD PUSH1 0x80 DUP7 ADD MSTORE POP PUSH2 0x1266 DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 MLOAD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1296 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0xF16 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x1266 DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x110E PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xF16 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0xC6A PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1325 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1348 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1330 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1357 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3EE JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723058 KECCAK256 CALL DUP11 0xec DUP3 0x4f 0xbe 0x25 0xf8 0x25 0xf6 0xbe 0xe7 DUP4 0x4c SLT 0xb2 EXTCODECOPY 0x47 0xf 0xc5 SWAP2 PUSH28 0xE3638390693D92CCD0336C6578706572696D656E74616CF564736F6C PUSH4 0x4300050A STOP BLOCKHASH ", - "sourceMap": "641:6501:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:6501:0;;;;;;;" + "object": "0x608060405234801561001057600080fd5b506113c2806100206000396000f3fe608060405234801561001057600080fd5b50600436106101ce5760003560e01c8063647341eb11610104578063ae2dae17116100a2578063d88be12f11610071578063d88be12f14610388578063ee8b86fb14610390578063f408fb311461026e578063fa315f9d146103a3576101ce565b8063ae2dae171461033a578063bb60736214610348578063bdab16881461035e578063d6d7618c14610373576101ce565b80637a791e6e116100de5780637a791e6e1461030f5780638ee52b4e146103175780639a3b61851461032a578063a3c2f6b614610332576101ce565b8063647341eb146102d957806376f15d5b146102e75780637833bec0146102ef576101ce565b80634303a54211610171578063586f84b21161014b578063586f84b21461029457806359c28add146102a95780635ba3c7c0146102be57806363d69c88146102c6576101ce565b80634303a5421461027c5780634582eab21461028457806345fdbdb71461028c576101ce565b80632e1a7d4d116101ad5780632e1a7d4d146102195780633687617d1461022c57806336b323961461024e5780633e9ef66a1461026e576101ce565b806209e437146101d35780630527c28f146101dd5780631310e444146101f0575b600080fd5b6101db6103b1565b005b6101db6101eb366004610c35565b6103ee565b6102036101fe366004610cea565b6103f1565b60405161021091906112e4565b60405180910390f35b6101db610227366004610cea565b6103f8565b61023f61023a366004610e62565b610449565b604051610210939291906110b9565b61026161025c366004610c72565b6104e9565b6040516102109190610ffb565b6101db6101eb366004610cb5565b6102036105cb565b6101db6105d2565b6101db610637565b61029c610669565b604051610210919061126f565b6102b1610671565b604051610210919061127a565b6101db610679565b6102616102d4366004610be3565b6106de565b6101db6101eb366004610e2d565b6102036106e7565b6103026102fd366004610d03565b6106f5565b6040516102109190611183565b6101db6107b2565b610203610325366004610cea565b6107b7565b6101db6107bd565b6102036107c8565b6101db6101eb366004610d9d565b6103506107cd565b6040516102109291906112ed565b610366610806565b604051610210919061101c565b61037b61080b565b60405161021091906112d1565b610203610964565b6101db61039e366004610cea565b6101eb565b6101db6101eb366004610cea565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e39061114c565b60405180910390fd5b565b50565b506107c790565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658260405161043e91906112e4565b60405180910390a250565b505060408051808201825260048082527f1234567800000000000000000000000000000000000000000000000000000000602080840191909152835180850185528281527f87654321000000000000000000000000000000000000000000000000000000008183015284518086019095529184527f616d657400000000000000000000000000000000000000000000000000000000908401529093909250565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090506000818760405160200161053a929190610fd9565b60405160208183030381529060405280519060200120905060018187878760405160008152602001604052604051610575949392919061109b565b6020604051602081039080840390855afa158015610597573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b6107c75b90565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526103e391906004016110fb565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e390611115565b6105cf61096a565b6105cf610982565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526103e391906004016110fb565b50929392505050565b600080546001019081905590565b6106fd6109a2565b50604080516080810182529182528051808201825260048082527f123456780000000000000000000000000000000000000000000000000000000060208381019190915280850192909252825180840184528181527f87654321000000000000000000000000000000000000000000000000000000008184015284840152825180840190935282527f616d65740000000000000000000000000000000000000000000000000000000090820152606082015290565b6103ec565b60010190565b600080546001019055565b600190565b60408051808201909152600581527f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152600191565b606090565b6108136109d0565b6040805160028082526060828101909352816020015b60608152602001906001900390816108295790505090506040518060400160405280600581526020017f30783132330000000000000000000000000000000000000000000000000000008152508160008151811061088357fe5b60200260200101819052506040518060400160405280600581526020017f3078333231000000000000000000000000000000000000000000000000000000815250816001815181106108d157fe5b6020908102919091018101919091526040805160c0810182526005608082018181527f307831323300000000000000000000000000000000000000000000000000000060a0840152825281840152808201939093528051808201909152600381527f6162630000000000000000000000000000000000000000000000000000000000918101919091526060820152905090565b6104d290565b604051806020016040528061097d6109fe565b905290565b60405180604001604052806109956109d0565b8152602001606081525090565b60405180608001604052806109b5610a11565b81526020016060815260200160608152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b6040518060200160405280600081525090565b60405180606001604052806000815260200160608152602001606081525090565b600082601f830112610a42578081fd5b813567ffffffffffffffff811115610a58578182fd5b6020610a678182840201611306565b828152925080830184820160005b84811015610a9e57610a8c888584358a0101610aa9565b83529183019190830190600101610a75565b505050505092915050565b600082601f830112610ab9578081fd5b813567ffffffffffffffff811115610acf578182fd5b610b0060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611306565b9150808252836020828501011115610b1757600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610b41578081fd5b610b4b6080611306565b90506000823567ffffffffffffffff80821115610b66578283fd5b610b7286838701610aa9565b84526020850135915063ffffffff82168214610b8c578283fd5b8160208501526040850135915080821115610ba5578283fd5b610bb186838701610a32565b60408501526060850135915080821115610bc9578283fd5b50610bd685828601610aa9565b6060840152505092915050565b600080600080600060a08688031215610bfb57600080fd5b8535610c068161135d565b945060208601359350604086013592506060860135610c248161135d565b949793965091946080013592915050565b600060208284031215610c4757600080fd5b813567ffffffffffffffff811115610c5e57600080fd5b610c6a84828501610a32565b949350505050565b60008060008060808587031215610c8857600080fd5b84359350602085013560ff81168114610ca057600080fd5b93969395505050506040820135916060013590565b600060208284031215610cc757600080fd5b813567ffffffffffffffff811115610cde57600080fd5b610c6a84828501610aa9565b600060208284031215610cfc57600080fd5b5035919050565b600060208284031215610d14578081fd5b813567ffffffffffffffff80821115610d2b578283fd5b81840160608187031215610d3d578384fd5b610d476060611306565b925080358352602081013582811115610d5e578485fd5b610d6a87828401610aa9565b602085015250604081013582811115610d81578485fd5b610d8d87828401610aa9565b6040850152509195945050505050565b600060208284031215610dae578081fd5b813567ffffffffffffffff80821115610dc5578283fd5b81840160408187031215610dd7578384fd5b610de16040611306565b9250803582811115610df1578485fd5b610dfd87828401610b30565b845250602081013582811115610e11578485fd5b610e1d87828401610aa9565b6020850152509195945050505050565b600060208284031215610e3f57600080fd5b813567ffffffffffffffff811115610e5657600080fd5b610c6a84828501610b30565b600080600060608486031215610e76578081fd5b83359250602084013567ffffffffffffffff80821115610e94578283fd5b610ea087838801610aa9565b93506040860135915080821115610eb5578283fd5b50610ec286828701610aa9565b9150509250925092565b60008151808452610ee481602086016020860161132d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815160808452610f2b6080850182610ecc565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b82851015610fb2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868303018452610f9e828251610ecc565b600195909501949387019391508601610f64565b506060880151955088810360608a0152610fcc8187610ecc565b9998505050505050505050565b60008351610feb81846020880161132d565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208083018184528085518083526040860191506040848202870101925083870160005b8281101561108e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261107c858351610f16565b94509285019290850190600101611042565b5092979650505050505050565b93845260ff9290921660208401526040830152606082015260800190565b6000606082526110cc6060830186610ecc565b82810360208401526110de8186610ecc565b83810360408501526110f08186610ecc565b979650505050505050565b60006020825261110e6020830184610ecc565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160806020840152805160a08401526020810151606060c08501526111b3610100850182610ecc565b604083015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608582030160e08601526111ee8183610ecc565b9250505060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301604086015261122c8383610ecc565b60408701519350818682030160608701526112478185610ecc565b9250506060860151925080858303016080860152506112668183610ecc565b95945050505050565b905151815260200190565b6000602082528251604060208401526112966060840182610f16565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526112668183610ecc565b60006020825261110e6020830184610f16565b90815260200190565b600083825260406020830152610c6a6040830184610ecc565b60405181810167ffffffffffffffff8111828210171561132557600080fd5b604052919050565b60005b83811015611348578181015183820152602001611330565b83811115611357576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103ee57600080fdfea365627a7a7231582063ecea5975740f0f78a75668344fe0b439794ce207110b6d2e40d344b1b768d36c6578706572696d656e74616cf564736f6c634300050b0040", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13C2 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1CE JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x647341EB GT PUSH2 0x104 JUMPI DUP1 PUSH4 0xAE2DAE17 GT PUSH2 0xA2 JUMPI DUP1 PUSH4 0xD88BE12F GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x388 JUMPI DUP1 PUSH4 0xEE8B86FB EQ PUSH2 0x390 JUMPI DUP1 PUSH4 0xF408FB31 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0xFA315F9D EQ PUSH2 0x3A3 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x33A JUMPI DUP1 PUSH4 0xBB607362 EQ PUSH2 0x348 JUMPI DUP1 PUSH4 0xBDAB1688 EQ PUSH2 0x35E JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x373 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x7A791E6E GT PUSH2 0xDE JUMPI DUP1 PUSH4 0x7A791E6E EQ PUSH2 0x30F JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x317 JUMPI DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x32A JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x332 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x647341EB EQ PUSH2 0x2D9 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0x7833BEC0 EQ PUSH2 0x2EF JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x4303A542 GT PUSH2 0x171 JUMPI DUP1 PUSH4 0x586F84B2 GT PUSH2 0x14B JUMPI DUP1 PUSH4 0x586F84B2 EQ PUSH2 0x294 JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x2A9 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x2C6 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x4303A542 EQ PUSH2 0x27C JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x284 JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x28C JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x2E1A7D4D GT PUSH2 0x1AD JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x219 JUMPI DUP1 PUSH4 0x3687617D EQ PUSH2 0x22C JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x24E JUMPI DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x26E JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x1D3 JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x1DD JUMPI DUP1 PUSH4 0x1310E444 EQ PUSH2 0x1F0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DB PUSH2 0x3B1 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xC35 JUMP JUMPDEST PUSH2 0x3EE JUMP JUMPDEST PUSH2 0x203 PUSH2 0x1FE CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x3F1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x12E4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1DB PUSH2 0x227 CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x3F8 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x23A CALLDATASIZE PUSH1 0x4 PUSH2 0xE62 JUMP JUMPDEST PUSH2 0x449 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x10B9 JUMP JUMPDEST PUSH2 0x261 PUSH2 0x25C CALLDATASIZE PUSH1 0x4 PUSH2 0xC72 JUMP JUMPDEST PUSH2 0x4E9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0xFFB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xCB5 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x5CB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x5D2 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x637 JUMP JUMPDEST PUSH2 0x29C PUSH2 0x669 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x126F JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x671 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x127A JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x679 JUMP JUMPDEST PUSH2 0x261 PUSH2 0x2D4 CALLDATASIZE PUSH1 0x4 PUSH2 0xBE3 JUMP JUMPDEST PUSH2 0x6DE JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xE2D JUMP JUMPDEST PUSH2 0x203 PUSH2 0x6E7 JUMP JUMPDEST PUSH2 0x302 PUSH2 0x2FD CALLDATASIZE PUSH1 0x4 PUSH2 0xD03 JUMP JUMPDEST PUSH2 0x6F5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x1183 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x7B2 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x325 CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x7B7 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x7BD JUMP JUMPDEST PUSH2 0x203 PUSH2 0x7C8 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xD9D JUMP JUMPDEST PUSH2 0x350 PUSH2 0x7CD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP3 SWAP2 SWAP1 PUSH2 0x12ED JUMP JUMPDEST PUSH2 0x366 PUSH2 0x806 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x101C JUMP JUMPDEST PUSH2 0x37B PUSH2 0x80B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x12D1 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x964 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x39E CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x1EB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E3 SWAP1 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST POP JUMP JUMPDEST POP PUSH2 0x7C7 SWAP1 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD PUSH2 0x43E SWAP2 SWAP1 PUSH2 0x12E4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE DUP3 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP4 ADD MSTORE DUP5 MLOAD DUP1 DUP7 ADD SWAP1 SWAP6 MSTORE SWAP2 DUP5 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP5 ADD MSTORE SWAP1 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x53A SWAP3 SWAP2 SWAP1 PUSH2 0xFD9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x575 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x109B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x597 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x7C7 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x3E3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x10FB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E3 SWAP1 PUSH2 0x1115 JUMP JUMPDEST PUSH2 0x5CF PUSH2 0x96A JUMP JUMPDEST PUSH2 0x5CF PUSH2 0x982 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x3E3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x10FB JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH2 0x6FD PUSH2 0x9A2 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE SWAP2 DUP3 MSTORE DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 MLOAD DUP1 DUP5 ADD DUP5 MSTORE DUP2 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP5 ADD MSTORE DUP5 DUP5 ADD MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP3 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x3EC JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x68656C6C6F000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1 SWAP2 JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH2 0x813 PUSH2 0x9D0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 DUP2 ADD SWAP1 SWAP4 MSTORE DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x829 JUMPI SWAP1 POP POP SWAP1 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3078313233000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x883 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3078333231000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x8D1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x5 PUSH1 0x80 DUP3 ADD DUP2 DUP2 MSTORE PUSH32 0x3078313233000000000000000000000000000000000000000000000000000000 PUSH1 0xA0 DUP5 ADD MSTORE DUP3 MSTORE DUP2 DUP5 ADD MSTORE DUP1 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x6162630000000000000000000000000000000000000000000000000000000000 SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MSTORE SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x97D PUSH2 0x9FE JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x995 PUSH2 0x9D0 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x9B5 PUSH2 0xA11 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xA42 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xA58 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0xA67 DUP2 DUP3 DUP5 MUL ADD PUSH2 0x1306 JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xA9E JUMPI PUSH2 0xA8C DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0xAA9 JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xA75 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xAB9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xACF JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xB00 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1306 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xB17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB41 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xB4B PUSH1 0x80 PUSH2 0x1306 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xB66 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xB72 DUP7 DUP4 DUP8 ADD PUSH2 0xAA9 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0xB8C JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xBA5 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xBB1 DUP7 DUP4 DUP8 ADD PUSH2 0xA32 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xBC9 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xBD6 DUP6 DUP3 DUP7 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xBFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0xC06 DUP2 PUSH2 0x135D JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0xC24 DUP2 PUSH2 0x135D JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xC47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xC5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xA32 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xC88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xCA0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xCDE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD14 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xD2B JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x60 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xD3D JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xD47 PUSH1 0x60 PUSH2 0x1306 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xD5E JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xD6A DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xD81 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xD8D DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xDAE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xDC5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xDD7 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xDE1 PUSH1 0x40 PUSH2 0x1306 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xDF1 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xDFD DUP8 DUP3 DUP5 ADD PUSH2 0xB30 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xE11 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xE1D DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xB30 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xE76 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xE94 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xEA0 DUP8 DUP4 DUP9 ADD PUSH2 0xAA9 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xEB5 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xEC2 DUP7 DUP3 DUP8 ADD PUSH2 0xAA9 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0xEE4 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x132D JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0xF2B PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0xFB2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0xF9E DUP3 DUP3 MLOAD PUSH2 0xECC JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0xF64 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0xFCC DUP2 DUP8 PUSH2 0xECC JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0xFEB DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x132D JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x108E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x107C DUP6 DUP4 MLOAD PUSH2 0xF16 JUMP JUMPDEST SWAP5 POP SWAP3 DUP6 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1042 JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0x10CC PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0xECC JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x10DE DUP2 DUP7 PUSH2 0xECC JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x10F0 DUP2 DUP7 PUSH2 0xECC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x110E PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xECC JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE DUP1 MLOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x60 PUSH1 0xC0 DUP6 ADD MSTORE PUSH2 0x11B3 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 DUP6 DUP3 SUB ADD PUSH1 0xE0 DUP7 ADD MSTORE PUSH2 0x11EE DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST SWAP3 POP POP POP PUSH1 0x20 DUP5 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP1 DUP6 DUP5 SUB ADD PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x122C DUP4 DUP4 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD SWAP4 POP DUP2 DUP7 DUP3 SUB ADD PUSH1 0x60 DUP8 ADD MSTORE PUSH2 0x1247 DUP2 DUP6 PUSH2 0xECC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP7 ADD MLOAD SWAP3 POP DUP1 DUP6 DUP4 SUB ADD PUSH1 0x80 DUP7 ADD MSTORE POP PUSH2 0x1266 DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 MLOAD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1296 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0xF16 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x1266 DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x110E PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xF16 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0xC6A PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1325 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1348 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1330 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1357 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3EE JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 PUSH4 0xECEA5975 PUSH21 0xF0F78A75668344FE0B439794CE207110B6D2E40D3 DIFFICULTY 0xb1 0xb7 PUSH9 0xD36C6578706572696D PUSH6 0x6E74616CF564 PUSH20 0x6F6C634300050B00400000000000000000000000 ", + "sourceMap": "641:6597:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:6597:0;;;;;;;" }, "deployedBytecode": { "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b50600436106101ce5760003560e01c8063647341eb11610104578063ae2dae17116100a2578063d88be12f11610071578063d88be12f14610388578063ee8b86fb14610390578063f408fb311461026e578063fa315f9d146103a3576101ce565b8063ae2dae171461033a578063bb60736214610348578063bdab16881461035e578063d6d7618c14610373576101ce565b80637a791e6e116100de5780637a791e6e1461030f5780638ee52b4e146103175780639a3b61851461032a578063a3c2f6b614610332576101ce565b8063647341eb146102d957806376f15d5b146102e75780637833bec0146102ef576101ce565b80634303a54211610171578063586f84b21161014b578063586f84b21461029457806359c28add146102a95780635ba3c7c0146102be57806363d69c88146102c6576101ce565b80634303a5421461027c5780634582eab21461028457806345fdbdb71461028c576101ce565b80632e1a7d4d116101ad5780632e1a7d4d146102195780633687617d1461022c57806336b323961461024e5780633e9ef66a1461026e576101ce565b806209e437146101d35780630527c28f146101dd5780631310e444146101f0575b600080fd5b6101db6103b1565b005b6101db6101eb366004610c35565b6103ee565b6102036101fe366004610cea565b6103f1565b60405161021091906112e4565b60405180910390f35b6101db610227366004610cea565b6103f8565b61023f61023a366004610e62565b610449565b604051610210939291906110b9565b61026161025c366004610c72565b6104e9565b6040516102109190610ffb565b6101db6101eb366004610cb5565b6102036105cb565b6101db6105d2565b6101db610637565b61029c610669565b604051610210919061126f565b6102b1610671565b604051610210919061127a565b6101db610679565b6102616102d4366004610be3565b6106de565b6101db6101eb366004610e2d565b6102036106e7565b6103026102fd366004610d03565b6106f5565b6040516102109190611183565b6101db6107b2565b610203610325366004610cea565b6107b7565b6101db6107bd565b6102036107c8565b6101db6101eb366004610d9d565b6103506107cd565b6040516102109291906112ed565b610366610806565b604051610210919061101c565b61037b61080b565b60405161021091906112d1565b610203610964565b6101db61039e366004610cea565b6101eb565b6101db6101eb366004610cea565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e39061114c565b60405180910390fd5b565b50565b506107c790565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658260405161043e91906112e4565b60405180910390a250565b505060408051808201825260048082527f1234567800000000000000000000000000000000000000000000000000000000602080840191909152835180850185528281527f87654321000000000000000000000000000000000000000000000000000000008183015284518086019095529184527f616d657400000000000000000000000000000000000000000000000000000000908401529093909250565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090506000818760405160200161053a929190610fd9565b60405160208183030381529060405280519060200120905060018187878760405160008152602001604052604051610575949392919061109b565b6020604051602081039080840390855afa158015610597573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b6107c75b90565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526103e391906004016110fb565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e390611115565b6105cf61096a565b6105cf610982565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526103e391906004016110fb565b50929392505050565b600080546001019081905590565b6106fd6109a2565b50604080516080810182529182528051808201825260048082527f123456780000000000000000000000000000000000000000000000000000000060208381019190915280850192909252825180840184528181527f87654321000000000000000000000000000000000000000000000000000000008184015284840152825180840190935282527f616d65740000000000000000000000000000000000000000000000000000000090820152606082015290565b6103ec565b60010190565b600080546001019055565b600190565b60408051808201909152600581527f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152600191565b606090565b6108136109d0565b6040805160028082526060828101909352816020015b60608152602001906001900390816108295790505090506040518060400160405280600581526020017f30783132330000000000000000000000000000000000000000000000000000008152508160008151811061088357fe5b60200260200101819052506040518060400160405280600581526020017f3078333231000000000000000000000000000000000000000000000000000000815250816001815181106108d157fe5b6020908102919091018101919091526040805160c0810182526005608082018181527f307831323300000000000000000000000000000000000000000000000000000060a0840152825281840152808201939093528051808201909152600381527f6162630000000000000000000000000000000000000000000000000000000000918101919091526060820152905090565b6104d290565b604051806020016040528061097d6109fe565b905290565b6040518060a001604052806109956109d0565b8152602001606081525090565b6040518060c001604052806109b5610a11565b81526020016060815260200160608152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b6040518060200160405280600081525090565b60405180606001604052806000815260200160608152602001606081525090565b600082601f830112610a42578081fd5b813567ffffffffffffffff811115610a58578182fd5b6020610a678182840201611306565b828152925080830184820160005b84811015610a9e57610a8c888584358a0101610aa9565b83529183019190830190600101610a75565b505050505092915050565b600082601f830112610ab9578081fd5b813567ffffffffffffffff811115610acf578182fd5b610b0060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611306565b9150808252836020828501011115610b1757600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610b41578081fd5b610b4b6080611306565b90506000823567ffffffffffffffff80821115610b66578283fd5b610b7286838701610aa9565b84526020850135915063ffffffff82168214610b8c578283fd5b8160208501526040850135915080821115610ba5578283fd5b610bb186838701610a32565b60408501526060850135915080821115610bc9578283fd5b50610bd685828601610aa9565b6060840152505092915050565b600080600080600060a08688031215610bfb57600080fd5b8535610c068161135d565b945060208601359350604086013592506060860135610c248161135d565b949793965091946080013592915050565b600060208284031215610c4757600080fd5b813567ffffffffffffffff811115610c5e57600080fd5b610c6a84828501610a32565b949350505050565b60008060008060808587031215610c8857600080fd5b84359350602085013560ff81168114610ca057600080fd5b93969395505050506040820135916060013590565b600060208284031215610cc757600080fd5b813567ffffffffffffffff811115610cde57600080fd5b610c6a84828501610aa9565b600060208284031215610cfc57600080fd5b5035919050565b600060208284031215610d14578081fd5b813567ffffffffffffffff80821115610d2b578283fd5b81840160608187031215610d3d578384fd5b610d476060611306565b925080358352602081013582811115610d5e578485fd5b610d6a87828401610aa9565b602085015250604081013582811115610d81578485fd5b610d8d87828401610aa9565b6040850152509195945050505050565b600060208284031215610dae578081fd5b813567ffffffffffffffff80821115610dc5578283fd5b81840160408187031215610dd7578384fd5b610de16040611306565b9250803582811115610df1578485fd5b610dfd87828401610b30565b845250602081013582811115610e11578485fd5b610e1d87828401610aa9565b6020850152509195945050505050565b600060208284031215610e3f57600080fd5b813567ffffffffffffffff811115610e5657600080fd5b610c6a84828501610b30565b600080600060608486031215610e76578081fd5b83359250602084013567ffffffffffffffff80821115610e94578283fd5b610ea087838801610aa9565b93506040860135915080821115610eb5578283fd5b50610ec286828701610aa9565b9150509250925092565b60008151808452610ee481602086016020860161132d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815160808452610f2b6080850182610ecc565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b82851015610fb2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868303018452610f9e828251610ecc565b600195909501949387019391508601610f64565b506060880151955088810360608a0152610fcc8187610ecc565b9998505050505050505050565b60008351610feb81846020880161132d565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208083018184528085518083526040860191506040848202870101925083870160005b8281101561108e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261107c858351610f16565b94509285019290850190600101611042565b5092979650505050505050565b93845260ff9290921660208401526040830152606082015260800190565b6000606082526110cc6060830186610ecc565b82810360208401526110de8186610ecc565b83810360408501526110f08186610ecc565b979650505050505050565b60006020825261110e6020830184610ecc565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160806020840152805160a08401526020810151606060c08501526111b3610100850182610ecc565b604083015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608582030160e08601526111ee8183610ecc565b9250505060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301604086015261122c8383610ecc565b60408701519350818682030160608701526112478185610ecc565b9250506060860151925080858303016080860152506112668183610ecc565b95945050505050565b905151815260200190565b6000602082528251604060208401526112966060840182610f16565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526112668183610ecc565b60006020825261110e6020830184610f16565b90815260200190565b600083825260406020830152610c6a6040830184610ecc565b60405181810167ffffffffffffffff8111828210171561132557600080fd5b604052919050565b60005b83811015611348578181015183820152602001611330565b83811115611357576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103ee57600080fdfea365627a7a72305820f18aec824fbe25f825f6bee7834c12b23c470fc5917be3638390693d92ccd0336c6578706572696d656e74616cf564736f6c634300050a0040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1CE JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x647341EB GT PUSH2 0x104 JUMPI DUP1 PUSH4 0xAE2DAE17 GT PUSH2 0xA2 JUMPI DUP1 PUSH4 0xD88BE12F GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x388 JUMPI DUP1 PUSH4 0xEE8B86FB EQ PUSH2 0x390 JUMPI DUP1 PUSH4 0xF408FB31 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0xFA315F9D EQ PUSH2 0x3A3 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x33A JUMPI DUP1 PUSH4 0xBB607362 EQ PUSH2 0x348 JUMPI DUP1 PUSH4 0xBDAB1688 EQ PUSH2 0x35E JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x373 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x7A791E6E GT PUSH2 0xDE JUMPI DUP1 PUSH4 0x7A791E6E EQ PUSH2 0x30F JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x317 JUMPI DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x32A JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x332 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x647341EB EQ PUSH2 0x2D9 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0x7833BEC0 EQ PUSH2 0x2EF JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x4303A542 GT PUSH2 0x171 JUMPI DUP1 PUSH4 0x586F84B2 GT PUSH2 0x14B JUMPI DUP1 PUSH4 0x586F84B2 EQ PUSH2 0x294 JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x2A9 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x2C6 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x4303A542 EQ PUSH2 0x27C JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x284 JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x28C JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x2E1A7D4D GT PUSH2 0x1AD JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x219 JUMPI DUP1 PUSH4 0x3687617D EQ PUSH2 0x22C JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x24E JUMPI DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x26E JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x1D3 JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x1DD JUMPI DUP1 PUSH4 0x1310E444 EQ PUSH2 0x1F0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DB PUSH2 0x3B1 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xC35 JUMP JUMPDEST PUSH2 0x3EE JUMP JUMPDEST PUSH2 0x203 PUSH2 0x1FE CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x3F1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x12E4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1DB PUSH2 0x227 CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x3F8 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x23A CALLDATASIZE PUSH1 0x4 PUSH2 0xE62 JUMP JUMPDEST PUSH2 0x449 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x10B9 JUMP JUMPDEST PUSH2 0x261 PUSH2 0x25C CALLDATASIZE PUSH1 0x4 PUSH2 0xC72 JUMP JUMPDEST PUSH2 0x4E9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0xFFB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xCB5 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x5CB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x5D2 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x637 JUMP JUMPDEST PUSH2 0x29C PUSH2 0x669 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x126F JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x671 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x127A JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x679 JUMP JUMPDEST PUSH2 0x261 PUSH2 0x2D4 CALLDATASIZE PUSH1 0x4 PUSH2 0xBE3 JUMP JUMPDEST PUSH2 0x6DE JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xE2D JUMP JUMPDEST PUSH2 0x203 PUSH2 0x6E7 JUMP JUMPDEST PUSH2 0x302 PUSH2 0x2FD CALLDATASIZE PUSH1 0x4 PUSH2 0xD03 JUMP JUMPDEST PUSH2 0x6F5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x1183 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x7B2 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x325 CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x7B7 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x7BD JUMP JUMPDEST PUSH2 0x203 PUSH2 0x7C8 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xD9D JUMP JUMPDEST PUSH2 0x350 PUSH2 0x7CD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP3 SWAP2 SWAP1 PUSH2 0x12ED JUMP JUMPDEST PUSH2 0x366 PUSH2 0x806 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x101C JUMP JUMPDEST PUSH2 0x37B PUSH2 0x80B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x12D1 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x964 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x39E CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x1EB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E3 SWAP1 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST POP JUMP JUMPDEST POP PUSH2 0x7C7 SWAP1 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD PUSH2 0x43E SWAP2 SWAP1 PUSH2 0x12E4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE DUP3 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP4 ADD MSTORE DUP5 MLOAD DUP1 DUP7 ADD SWAP1 SWAP6 MSTORE SWAP2 DUP5 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP5 ADD MSTORE SWAP1 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x53A SWAP3 SWAP2 SWAP1 PUSH2 0xFD9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x575 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x109B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x597 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x7C7 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x3E3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x10FB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E3 SWAP1 PUSH2 0x1115 JUMP JUMPDEST PUSH2 0x5CF PUSH2 0x96A JUMP JUMPDEST PUSH2 0x5CF PUSH2 0x982 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x3E3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x10FB JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH2 0x6FD PUSH2 0x9A2 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE SWAP2 DUP3 MSTORE DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 MLOAD DUP1 DUP5 ADD DUP5 MSTORE DUP2 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP5 ADD MSTORE DUP5 DUP5 ADD MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP3 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x3EC JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x68656C6C6F000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1 SWAP2 JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH2 0x813 PUSH2 0x9D0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 DUP2 ADD SWAP1 SWAP4 MSTORE DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x829 JUMPI SWAP1 POP POP SWAP1 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3078313233000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x883 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3078333231000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x8D1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x5 PUSH1 0x80 DUP3 ADD DUP2 DUP2 MSTORE PUSH32 0x3078313233000000000000000000000000000000000000000000000000000000 PUSH1 0xA0 DUP5 ADD MSTORE DUP3 MSTORE DUP2 DUP5 ADD MSTORE DUP1 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x6162630000000000000000000000000000000000000000000000000000000000 SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MSTORE SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x97D PUSH2 0x9FE JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x995 PUSH2 0x9D0 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x9B5 PUSH2 0xA11 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xA42 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xA58 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0xA67 DUP2 DUP3 DUP5 MUL ADD PUSH2 0x1306 JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xA9E JUMPI PUSH2 0xA8C DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0xAA9 JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xA75 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xAB9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xACF JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xB00 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1306 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xB17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB41 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xB4B PUSH1 0x80 PUSH2 0x1306 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xB66 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xB72 DUP7 DUP4 DUP8 ADD PUSH2 0xAA9 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0xB8C JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xBA5 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xBB1 DUP7 DUP4 DUP8 ADD PUSH2 0xA32 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xBC9 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xBD6 DUP6 DUP3 DUP7 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xBFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0xC06 DUP2 PUSH2 0x135D JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0xC24 DUP2 PUSH2 0x135D JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xC47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xC5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xA32 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xC88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xCA0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xCDE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD14 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xD2B JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x60 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xD3D JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xD47 PUSH1 0x60 PUSH2 0x1306 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xD5E JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xD6A DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xD81 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xD8D DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xDAE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xDC5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xDD7 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xDE1 PUSH1 0x40 PUSH2 0x1306 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xDF1 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xDFD DUP8 DUP3 DUP5 ADD PUSH2 0xB30 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xE11 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xE1D DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xB30 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xE76 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xE94 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xEA0 DUP8 DUP4 DUP9 ADD PUSH2 0xAA9 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xEB5 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xEC2 DUP7 DUP3 DUP8 ADD PUSH2 0xAA9 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0xEE4 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x132D JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0xF2B PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0xFB2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0xF9E DUP3 DUP3 MLOAD PUSH2 0xECC JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0xF64 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0xFCC DUP2 DUP8 PUSH2 0xECC JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0xFEB DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x132D JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x108E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x107C DUP6 DUP4 MLOAD PUSH2 0xF16 JUMP JUMPDEST SWAP5 POP SWAP3 DUP6 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1042 JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0x10CC PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0xECC JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x10DE DUP2 DUP7 PUSH2 0xECC JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x10F0 DUP2 DUP7 PUSH2 0xECC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x110E PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xECC JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE DUP1 MLOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x60 PUSH1 0xC0 DUP6 ADD MSTORE PUSH2 0x11B3 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 DUP6 DUP3 SUB ADD PUSH1 0xE0 DUP7 ADD MSTORE PUSH2 0x11EE DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST SWAP3 POP POP POP PUSH1 0x20 DUP5 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP1 DUP6 DUP5 SUB ADD PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x122C DUP4 DUP4 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD SWAP4 POP DUP2 DUP7 DUP3 SUB ADD PUSH1 0x60 DUP8 ADD MSTORE PUSH2 0x1247 DUP2 DUP6 PUSH2 0xECC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP7 ADD MLOAD SWAP3 POP DUP1 DUP6 DUP4 SUB ADD PUSH1 0x80 DUP7 ADD MSTORE POP PUSH2 0x1266 DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 MLOAD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1296 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0xF16 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x1266 DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x110E PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xF16 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0xC6A PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1325 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1348 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1330 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1357 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3EE JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723058 KECCAK256 CALL DUP11 0xec DUP3 0x4f 0xbe 0x25 0xf8 0x25 0xf6 0xbe 0xe7 DUP4 0x4c SLT 0xb2 EXTCODECOPY 0x47 0xf 0xc5 SWAP2 PUSH28 0xE3638390693D92CCD0336C6578706572696D656E74616CF564736F6C PUSH4 0x4300050A STOP BLOCKHASH ", - "sourceMap": "641:6501:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:6501:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1496:107;;;:::i;:::-;;3190:63;;;;;;;;;:::i;6106:128::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2585:84;;;;;;;;;:::i;6729:345::-;;;;;;;;;:::i;:::-;;;;;;;;;;2184:334;;;;;;;;;:::i;:::-;;;;;;;;3028:52;;;;;;;5711:117;;;:::i;1389:101::-;;;:::i;1286:97::-;;;:::i;4401:153::-;;;:::i;:::-;;;;;;;;4133:73;;;:::i;:::-;;;;;;;;1609:111;;;:::i;2823:166::-;;;;;;;;;:::i;3399:52::-;;;;;;;4580:72;;;:::i;6307:317::-;;;;;;;;;:::i;:::-;;;;;;;;5520:112;;;:::i;989:140::-;;;;;;;;;:::i;4657:69::-;;;:::i;862:121::-;;;:::i;4064:64::-;;;;;;;4732:134;;;:::i;:::-;;;;;;;;;3889:80;;;:::i;:::-;;;;;;;;3533:350;;;:::i;:::-;;;;;;;;1135:145;;;:::i;5907:123::-;;;;;;;;;:::i;4872:47::-;;;;;;;1496:107;1564:32;;;;;;;;;;;;;;;;;;;;1496:107::o;3190:63::-;;:::o;6106:128::-;-1:-1:-1;6223:4:0;;6106:128::o;2585:84::-;2646:10;2635:27;;;2658:3;2635:27;;;;;;;;;;;;;;;2585:84;:::o;6729:345::-;-1:-1:-1;;6976:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6729:345:0:o;2184:334::-;2295:21;2332:19;:56;;;;;;;;;;;;;;;;;;;2398:20;2448:6;2456:4;2431:30;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2431:30:0;;;2421:41;;;;;;2398:64;;2479:32;2489:12;2503:1;2506;2509;2479:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2479:32:0;;;;;;2184:334;-1:-1:-1;;;;;;;;2184:334:0:o;5711:117::-;5817:4;5711:117;;:::o;1389:101::-;1469:13;;;;;;;;;;;;;;;;1462:21;;;;;;;1469:13;1462:21;;;;1286:97;1353:23;;;;;;;;;;;4401:153;4495:51;;:::i;4133:73::-;4183:19;;:::i;1609:111::-;1698:14;;;;;;;;;;;;;;;;1683:30;;;;;;;1698:14;1683:30;;;;2823:166;-1:-1:-1;2981:1:0;;2823:166;-1:-1:-1;;;2823:166:0:o;4580:72::-;4620:4;4635:14;;4648:1;4635:14;;;;;4580:72;:::o;6307:317::-;6421:20;;:::i;:::-;-1:-1:-1;6464:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6307:317::o;5520:112::-;5604:21;;989:140;1117:1;:5;;989:140::o;4657:69::-;4709:9;:14;;4722:1;4709:14;;;4657:69::o;862:121::-;975:1;862:121;:::o;4732:134::-;4840:19;;;;;;;;;;;;;;;;;4848:1;4732:134;:::o;3889:80::-;3950:15;3889:80;:::o;3533:350::-;3577:15;;:::i;:::-;3631:14;;;3643:1;3631:14;;;3604:24;3631:14;;;;;;;;;;;;;;;;;;;;;;;;;;3604:41;;3655:22;;;;;;;;;;;;;;;;;:9;3665:1;3655:12;;;;;;;;;;;;;:22;;;;3687;;;;;;;;;;;;;;;;;:9;3697:1;3687:12;;;;;;;;;;;;;;;;;;:22;;;;3727:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3727:149:0;;;;-1:-1:-1;3533:350:0;:::o;1135:145::-;711:4;1135:145;:::o;641:6501::-;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;158:685:-1:-;;276:3;269:4;261:6;257:17;253:27;243:2;;-1:-1;;284:12;243:2;331:6;318:20;31012:18;31004:6;31001:30;30998:2;;;-1:-1;;31034:12;30998:2;31079:4;353:81;31142:4;31079;31071:6;31067:17;31132:15;353:81;;;462:21;;;344:90;-1:-1;519:14;;;494:17;;;614:1;599:238;624:6;621:1;618:13;599:238;;;731:42;769:3;506:4;707:3;694:17;498:6;682:30;;731:42;;;719:55;;788:14;;;;816;;;;646:1;639:9;599:238;;;603:14;;;;;236:607;;;;;1706:432;;1803:3;1796:4;1788:6;1784:17;1780:27;1770:2;;-1:-1;;1811:12;1770:2;1858:6;1845:20;31619:18;31611:6;31608:30;31605:2;;;-1:-1;;31641:12;31605:2;1880:60;31782:4;31714:9;1796:4;31699:6;31695:17;31691:33;31772:15;1880:60;;;1871:69;;1960:6;1953:5;1946:21;2064:3;31782:4;2055:6;1988;2046:16;;2043:25;2040:2;;;2081:1;;2071:12;2040:2;36120:6;31782:4;1988:6;1984:17;31782:4;2022:5;2018:16;36097:30;36176:1;36158:16;;;31782:4;36158:16;36151:27;2022:5;1763:375;-1:-1;;1763:375;5221:1071;;5329:4;5317:9;5312:3;5308:19;5304:30;5301:2;;;-1:-1;;5337:12;5301:2;5365:20;5329:4;5365:20;;;5356:29;;5468:1;5453:17;5440:31;5491:18;;5483:6;5480:30;5477:2;;;5523:1;5520;5513:12;5477:2;5557:54;5607:3;5598:6;5587:9;5583:22;5557:54;;;5540:15;5533:79;5678:2;5735:9;5731:22;7616:20;7607:29;;35927:10;37234:5;35916:22;37210:5;37207:34;37197:2;;37255:1;37252;37245:12;37197:2;5711:48;5678:2;5697:5;5693:16;5686:74;5865:2;5854:9;5850:18;5837:32;5823:46;;5889:18;5881:6;5878:30;5875:2;;;5921:1;5918;5911:12;5875:2;5956:75;6027:3;6018:6;6007:9;6003:22;5956:75;;;5865:2;5942:5;5938:16;5931:101;6124:2;6113:9;6109:18;6096:32;6082:46;;6148:18;6140:6;6137:30;6134:2;;;6180:1;6177;6170:12;6134:2;;6215:55;6266:3;6257:6;6246:9;6242:22;6215:55;;;6124:2;6201:5;6197:16;6190:81;;;5295:997;;;;;7818:743;;;;;;7990:3;7978:9;7969:7;7965:23;7961:33;7958:2;;;-1:-1;;7997:12;7958:2;85:6;72:20;97:33;124:5;97:33;;;8049:63;-1:-1;8149:2;8188:22;;7480:20;;-1:-1;8257:2;8296:22;;7480:20;;-1:-1;8365:2;8404:22;;72:20;97:33;72:20;97:33;;;7952:609;;;;-1:-1;7952:609;;8473:3;8513:22;7480:20;;7952:609;-1:-1;;7952:609;8568:387;;8702:2;8690:9;8681:7;8677:23;8673:32;8670:2;;;-1:-1;;8708:12;8670:2;8766:17;8753:31;8804:18;8796:6;8793:30;8790:2;;;-1:-1;;8826:12;8790:2;8856:83;8931:7;8922:6;8911:9;8907:22;8856:83;;;8846:93;8664:291;-1:-1;;;;8664:291;8962:613;;;;;9115:3;9103:9;9094:7;9090:23;9086:33;9083:2;;;-1:-1;;9122:12;9083:2;1648:6;1635:20;9174:63;;9274:2;9315:9;9311:22;7750:20;36021:4;37354:5;36010:16;37331:5;37328:33;37318:2;;-1:-1;;37365:12;37318:2;9077:498;;9282:61;;-1:-1;;;;9380:2;9419:22;;1635:20;;9488:2;9527:22;1635:20;;9077:498;9582:345;;9695:2;9683:9;9674:7;9670:23;9666:32;9663:2;;;-1:-1;;9701:12;9663:2;9759:17;9746:31;9797:18;9789:6;9786:30;9783:2;;;-1:-1;;9819:12;9783:2;9849:62;9903:7;9894:6;9883:9;9879:22;9849:62;;9934:239;;10037:2;10025:9;10016:7;10012:23;10008:32;10005:2;;;-1:-1;;10043:12;10005:2;-1:-1;2661:20;;9999:174;-1:-1;9999:174;10534:385;;10667:2;10655:9;10646:7;10642:23;10638:32;10635:2;;;10683:1;10680;10673:12;10635:2;10731:17;10718:31;10769:18;;10761:6;10758:30;10755:2;;;10801:1;10798;10791:12;10755:2;10886:6;10875:9;10871:22;3780:4;3768:9;3763:3;3759:19;3755:30;3752:2;;;3798:1;3795;3788:12;3752:2;3816:20;3780:4;3816:20;;;3807:29;;7493:6;7480:20;3899:15;3892:74;10667:2;4043:9;4039:18;4026:32;4078:18;4070:6;4067:30;4064:2;;;4110:1;4107;4100:12;4064:2;4145:54;4195:3;4186:6;4175:9;4171:22;4145:54;;;10667:2;4131:5;4127:16;4120:80;;4288:2;4277:9;4273:18;4260:32;4312:18;4304:6;4301:30;4298:2;;;4344:1;4341;4334:12;4298:2;4379:55;4430:3;4421:6;4410:9;4406:22;4379:55;;;4288:2;4361:16;;4354:81;-1:-1;4365:5;;10629:290;-1:-1;;;;;10629:290;10926:385;;11059:2;11047:9;11038:7;11034:23;11030:32;11027:2;;;11075:1;11072;11065:12;11027:2;11123:17;11110:31;11161:18;;11153:6;11150:30;11147:2;;;11193:1;11190;11183:12;11147:2;11278:6;11267:9;11263:22;4619:4;4607:9;4602:3;4598:19;4594:30;4591:2;;;4637:1;4634;4627:12;4591:2;4655:20;4619:4;4655:20;;;4646:29;;4745:17;4732:31;4783:18;4775:6;4772:30;4769:2;;;4815:1;4812;4805:12;4769:2;4849:68;4913:3;4904:6;4893:9;4889:22;4849:68;;;4832:15;4825:93;;11059:2;5003:9;4999:18;4986:32;5038:18;5030:6;5027:30;5024:2;;;5070:1;5067;5060:12;5024:2;5105:55;5156:3;5147:6;5136:9;5132:22;5105:55;;;11059:2;5087:16;;5080:81;-1:-1;5091:5;;11021:290;-1:-1;;;;;11021:290;11318:373;;11445:2;11433:9;11424:7;11420:23;11416:32;11413:2;;;-1:-1;;11451:12;11413:2;11509:17;11496:31;11547:18;11539:6;11536:30;11533:2;;;-1:-1;;11569:12;11533:2;11599:76;11667:7;11658:6;11647:9;11643:22;11599:76;;11946:701;;;;12103:2;12091:9;12082:7;12078:23;12074:32;12071:2;;;12119:1;12116;12109:12;12071:2;7493:6;7480:20;12161:63;;12289:2;12278:9;12274:18;12261:32;12313:18;;12305:6;12302:30;12299:2;;;12345:1;12342;12335:12;12299:2;12365:62;12419:7;12410:6;12399:9;12395:22;12365:62;;;12355:72;;12492:2;12481:9;12477:18;12464:32;12450:46;;12516:18;12508:6;12505:30;12502:2;;;12548:1;12545;12538:12;12502:2;;12568:63;12623:7;12614:6;12603:9;12599:22;12568:63;;;12558:73;;;12065:582;;;;;;15443:343;;15585:5;33226:12;34312:6;34307:3;34300:19;15678:52;15723:6;34349:4;34344:3;34340:14;34349:4;15704:5;15700:16;15678:52;;;36638:2;36618:14;36634:7;36614:28;15742:39;;;;34349:4;15742:39;;15533:253;-1:-1;;15533:253;22246:1078;;22470:15;22464:22;22393:4;22506:13;22499:37;22551:67;22393:4;22388:3;22384:14;22599:12;22551:67;;;22708:4;;;35927:10;22708:4;22701:5;22697:16;22691:23;35916:22;22775:4;22770:3;22766:14;24752:36;22876:4;22869:5;22865:16;22859:23;22928:3;22922:4;22918:14;22876:4;22906:3;22902:14;22895:38;22948:109;13419:5;33226:12;34312:6;34307:3;34300:19;34349:4;34344:3;34340:14;13431:88;;22708:4;13584;13576:6;13572:17;34344:3;13563:27;;32911:4;13662:5;32902:14;-1:-1;13707:10;;13701:341;13726:6;13723:1;13720:13;13701:341;;;13778:20;34344:3;13782:4;13778:20;;13773:3;13766:33;12766:60;12822:3;13833:6;13827:13;12766:60;;;13748:1;13741:9;;;;;14021:14;;;;13847:82;-1:-1;34026:14;;13701:341;;;13705:14;23145:4;23138:5;23134:16;23128:23;23108:43;;23197:3;23191:4;23187:14;23145:4;23175:3;23171:14;23164:38;23217:69;23281:4;23267:12;23217:69;;;23308:11;22366:958;-1:-1;;;;;;;;;22366:958;24914:401;;15953:5;33226:12;16064:52;16109:6;16104:3;16097:4;16090:5;16086:16;16064:52;;;16128:16;;;;15235:37;;;-1:-1;16097:4;25278:12;;25067:248;-1:-1;25067:248;25322:213;35721:42;35710:54;;;;13153:37;;25440:2;25425:18;;25411:124;25542:437;;25748:2;;25737:9;25733:18;25788:20;25769:17;25762:47;25823:146;14406:5;33226:12;34312:6;34307:3;34300:19;34340:14;25737:9;34340:14;14418:112;;34340:14;14595:4;14587:6;14583:17;25737:9;14574:27;;14562:39;;32911:4;14691:5;32902:14;-1:-1;14730:387;14755:6;14752:1;14749:13;14730:387;;;14807:20;25737:9;14811:4;14807:20;;14802:3;14795:33;12980:88;13064:3;14862:6;14856:13;12980:88;;;14876:110;-1:-1;15096:14;;;;34026;;;;14777:1;14770:9;14730:387;;;-1:-1;25815:154;;25719:260;-1:-1;;;;;;;25719:260;25986:539;15235:37;;;36021:4;36010:16;;;;26345:2;26330:18;;24867:35;26428:2;26413:18;;15235:37;26511:2;26496:18;;15235:37;26184:3;26169:19;;26155:370;26532:691;;26762:2;26783:17;26776:47;26837:76;26762:2;26751:9;26747:18;26899:6;26837:76;;;26961:9;26955:4;26951:20;26946:2;26935:9;26931:18;26924:48;26986:76;27057:4;27048:6;26986:76;;;27110:9;27104:4;27100:20;27095:2;27084:9;27080:18;27073:48;27135:78;27208:4;27199:6;27135:78;;;27127:86;26733:490;-1:-1;;;;;;;26733:490;27230:293;;27364:2;27385:17;27378:47;27439:74;27364:2;27353:9;27349:18;27499:6;27439:74;;;27431:82;27335:188;-1:-1;;;27335:188;27530:407;27721:2;27735:47;;;17729:2;27706:18;;;34300:19;17765:66;34340:14;;;17745:87;17851:12;;;27692:245;27944:407;28135:2;28149:47;;;18102:2;28120:18;;;34300:19;18138:66;34340:14;;;18118:87;18224:12;;;28106:245;28358:381;;28536:2;28557:17;28550:47;19419:15;19413:22;19346:4;28536:2;28525:9;28521:18;19448:37;18539:15;18533:22;19337:14;28525:9;19337:14;15235:37;28536:2;18694:5;18690:16;18684:23;18468:4;18727:14;28525:9;18727:14;18720:38;18773:67;18459:14;28525:9;18459:14;18821:12;18773:67;;;18924:4;18917:5;18913:16;18907:23;18887:43;;18966:14;28525:9;18970:4;18966:14;;18950;28525:9;18950:14;18943:38;18996:69;19060:4;19046:12;18996:69;;;19087:11;;;;28536:2;19686:5;19682:16;19676:23;19735:14;;28525:9;19739:4;19735:14;;18924:4;28525:9;19719:14;19712:38;19765:67;19827:4;19813:12;19765:67;;;18924:4;19911:5;19907:16;19901:23;19881:43;;19960:14;28525:9;19964:4;19960:14;;18468:4;28525:9;19944:14;19937:38;19990:67;20052:4;20038:12;19990:67;;;19982:75;;;18468:4;20136:5;20132:16;20126:23;20106:43;;20185:14;28525:9;20189:4;20185:14;;19346:4;28525:9;20169:14;20162:38;;20215:69;20279:4;20265:12;20215:69;;;28603:126;28507:232;-1:-1;;;;;28507:232;28746:453;20750:22;;22067;15235:37;;28984:2;28969:18;;28955:244;29206:377;;29382:2;29403:17;29396:47;21267:15;21261:22;21188:4;29382:2;29371:9;29367:18;21296:37;21348:95;21179:14;29371:9;21179:14;21424:12;21348:95;;;29382:2;21528:5;21524:16;21518:23;21498:43;;21577:14;29371:9;21581:4;21577:14;;21188:4;29371:9;21561:14;21554:38;21607:69;21671:4;21657:12;21607:69;;29590:353;;29754:2;29775:17;29768:47;29829:104;29754:2;29743:9;29739:18;29919:6;29829:104;;29950:213;15235:37;;;30068:2;30053:18;;30039:124;30170:412;;15265:5;15242:3;15235:37;30336:2;30454;30443:9;30439:18;30432:48;30494:78;30336:2;30325:9;30321:18;30558:6;30494:78;;30589:256;30651:2;30645:9;30677:17;;;30752:18;30737:34;;30773:22;;;30734:62;30731:2;;;30809:1;;30799:12;30731:2;30651;30818:22;30629:216;;-1:-1;30629:216;36193:268;36258:1;36265:101;36279:6;36276:1;36273:13;36265:101;;;36346:11;;;36340:18;36327:11;;;36320:39;36301:2;36294:10;36265:101;;;36381:6;36378:1;36375:13;36372:2;;;36258:1;36437:6;36432:3;36428:16;36421:27;36372:2;;36242:219;;;;36655:117;35721:42;36742:5;35710:54;36717:5;36714:35;36704:2;;36763:1;;36753:12" + "object": "0x608060405234801561001057600080fd5b50600436106101ce5760003560e01c8063647341eb11610104578063ae2dae17116100a2578063d88be12f11610071578063d88be12f14610388578063ee8b86fb14610390578063f408fb311461026e578063fa315f9d146103a3576101ce565b8063ae2dae171461033a578063bb60736214610348578063bdab16881461035e578063d6d7618c14610373576101ce565b80637a791e6e116100de5780637a791e6e1461030f5780638ee52b4e146103175780639a3b61851461032a578063a3c2f6b614610332576101ce565b8063647341eb146102d957806376f15d5b146102e75780637833bec0146102ef576101ce565b80634303a54211610171578063586f84b21161014b578063586f84b21461029457806359c28add146102a95780635ba3c7c0146102be57806363d69c88146102c6576101ce565b80634303a5421461027c5780634582eab21461028457806345fdbdb71461028c576101ce565b80632e1a7d4d116101ad5780632e1a7d4d146102195780633687617d1461022c57806336b323961461024e5780633e9ef66a1461026e576101ce565b806209e437146101d35780630527c28f146101dd5780631310e444146101f0575b600080fd5b6101db6103b1565b005b6101db6101eb366004610c35565b6103ee565b6102036101fe366004610cea565b6103f1565b60405161021091906112e4565b60405180910390f35b6101db610227366004610cea565b6103f8565b61023f61023a366004610e62565b610449565b604051610210939291906110b9565b61026161025c366004610c72565b6104e9565b6040516102109190610ffb565b6101db6101eb366004610cb5565b6102036105cb565b6101db6105d2565b6101db610637565b61029c610669565b604051610210919061126f565b6102b1610671565b604051610210919061127a565b6101db610679565b6102616102d4366004610be3565b6106de565b6101db6101eb366004610e2d565b6102036106e7565b6103026102fd366004610d03565b6106f5565b6040516102109190611183565b6101db6107b2565b610203610325366004610cea565b6107b7565b6101db6107bd565b6102036107c8565b6101db6101eb366004610d9d565b6103506107cd565b6040516102109291906112ed565b610366610806565b604051610210919061101c565b61037b61080b565b60405161021091906112d1565b610203610964565b6101db61039e366004610cea565b6101eb565b6101db6101eb366004610cea565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e39061114c565b60405180910390fd5b565b50565b506107c790565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658260405161043e91906112e4565b60405180910390a250565b505060408051808201825260048082527f1234567800000000000000000000000000000000000000000000000000000000602080840191909152835180850185528281527f87654321000000000000000000000000000000000000000000000000000000008183015284518086019095529184527f616d657400000000000000000000000000000000000000000000000000000000908401529093909250565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090506000818760405160200161053a929190610fd9565b60405160208183030381529060405280519060200120905060018187878760405160008152602001604052604051610575949392919061109b565b6020604051602081039080840390855afa158015610597573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b6107c75b90565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526103e391906004016110fb565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e390611115565b6105cf61096a565b6105cf610982565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526103e391906004016110fb565b50929392505050565b600080546001019081905590565b6106fd6109a2565b50604080516080810182529182528051808201825260048082527f123456780000000000000000000000000000000000000000000000000000000060208381019190915280850192909252825180840184528181527f87654321000000000000000000000000000000000000000000000000000000008184015284840152825180840190935282527f616d65740000000000000000000000000000000000000000000000000000000090820152606082015290565b6103ec565b60010190565b600080546001019055565b600190565b60408051808201909152600581527f68656c6c6f0000000000000000000000000000000000000000000000000000006020820152600191565b606090565b6108136109d0565b6040805160028082526060828101909352816020015b60608152602001906001900390816108295790505090506040518060400160405280600581526020017f30783132330000000000000000000000000000000000000000000000000000008152508160008151811061088357fe5b60200260200101819052506040518060400160405280600581526020017f3078333231000000000000000000000000000000000000000000000000000000815250816001815181106108d157fe5b6020908102919091018101919091526040805160c0810182526005608082018181527f307831323300000000000000000000000000000000000000000000000000000060a0840152825281840152808201939093528051808201909152600381527f6162630000000000000000000000000000000000000000000000000000000000918101919091526060820152905090565b6104d290565b604051806020016040528061097d6109fe565b905290565b60405180604001604052806109956109d0565b8152602001606081525090565b60405180608001604052806109b5610a11565b81526020016060815260200160608152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b6040518060200160405280600081525090565b60405180606001604052806000815260200160608152602001606081525090565b600082601f830112610a42578081fd5b813567ffffffffffffffff811115610a58578182fd5b6020610a678182840201611306565b828152925080830184820160005b84811015610a9e57610a8c888584358a0101610aa9565b83529183019190830190600101610a75565b505050505092915050565b600082601f830112610ab9578081fd5b813567ffffffffffffffff811115610acf578182fd5b610b0060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611306565b9150808252836020828501011115610b1757600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610b41578081fd5b610b4b6080611306565b90506000823567ffffffffffffffff80821115610b66578283fd5b610b7286838701610aa9565b84526020850135915063ffffffff82168214610b8c578283fd5b8160208501526040850135915080821115610ba5578283fd5b610bb186838701610a32565b60408501526060850135915080821115610bc9578283fd5b50610bd685828601610aa9565b6060840152505092915050565b600080600080600060a08688031215610bfb57600080fd5b8535610c068161135d565b945060208601359350604086013592506060860135610c248161135d565b949793965091946080013592915050565b600060208284031215610c4757600080fd5b813567ffffffffffffffff811115610c5e57600080fd5b610c6a84828501610a32565b949350505050565b60008060008060808587031215610c8857600080fd5b84359350602085013560ff81168114610ca057600080fd5b93969395505050506040820135916060013590565b600060208284031215610cc757600080fd5b813567ffffffffffffffff811115610cde57600080fd5b610c6a84828501610aa9565b600060208284031215610cfc57600080fd5b5035919050565b600060208284031215610d14578081fd5b813567ffffffffffffffff80821115610d2b578283fd5b81840160608187031215610d3d578384fd5b610d476060611306565b925080358352602081013582811115610d5e578485fd5b610d6a87828401610aa9565b602085015250604081013582811115610d81578485fd5b610d8d87828401610aa9565b6040850152509195945050505050565b600060208284031215610dae578081fd5b813567ffffffffffffffff80821115610dc5578283fd5b81840160408187031215610dd7578384fd5b610de16040611306565b9250803582811115610df1578485fd5b610dfd87828401610b30565b845250602081013582811115610e11578485fd5b610e1d87828401610aa9565b6020850152509195945050505050565b600060208284031215610e3f57600080fd5b813567ffffffffffffffff811115610e5657600080fd5b610c6a84828501610b30565b600080600060608486031215610e76578081fd5b83359250602084013567ffffffffffffffff80821115610e94578283fd5b610ea087838801610aa9565b93506040860135915080821115610eb5578283fd5b50610ec286828701610aa9565b9150509250925092565b60008151808452610ee481602086016020860161132d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815160808452610f2b6080850182610ecc565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b82851015610fb2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868303018452610f9e828251610ecc565b600195909501949387019391508601610f64565b506060880151955088810360608a0152610fcc8187610ecc565b9998505050505050505050565b60008351610feb81846020880161132d565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208083018184528085518083526040860191506040848202870101925083870160005b8281101561108e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261107c858351610f16565b94509285019290850190600101611042565b5092979650505050505050565b93845260ff9290921660208401526040830152606082015260800190565b6000606082526110cc6060830186610ecc565b82810360208401526110de8186610ecc565b83810360408501526110f08186610ecc565b979650505050505050565b60006020825261110e6020830184610ecc565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160806020840152805160a08401526020810151606060c08501526111b3610100850182610ecc565b604083015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608582030160e08601526111ee8183610ecc565b9250505060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085840301604086015261122c8383610ecc565b60408701519350818682030160608701526112478185610ecc565b9250506060860151925080858303016080860152506112668183610ecc565b95945050505050565b905151815260200190565b6000602082528251604060208401526112966060840182610f16565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526112668183610ecc565b60006020825261110e6020830184610f16565b90815260200190565b600083825260406020830152610c6a6040830184610ecc565b60405181810167ffffffffffffffff8111828210171561132557600080fd5b604052919050565b60005b83811015611348578181015183820152602001611330565b83811115611357576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103ee57600080fdfea365627a7a7231582063ecea5975740f0f78a75668344fe0b439794ce207110b6d2e40d344b1b768d36c6578706572696d656e74616cf564736f6c634300050b0040", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1CE JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x647341EB GT PUSH2 0x104 JUMPI DUP1 PUSH4 0xAE2DAE17 GT PUSH2 0xA2 JUMPI DUP1 PUSH4 0xD88BE12F GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x388 JUMPI DUP1 PUSH4 0xEE8B86FB EQ PUSH2 0x390 JUMPI DUP1 PUSH4 0xF408FB31 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0xFA315F9D EQ PUSH2 0x3A3 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x33A JUMPI DUP1 PUSH4 0xBB607362 EQ PUSH2 0x348 JUMPI DUP1 PUSH4 0xBDAB1688 EQ PUSH2 0x35E JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x373 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x7A791E6E GT PUSH2 0xDE JUMPI DUP1 PUSH4 0x7A791E6E EQ PUSH2 0x30F JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x317 JUMPI DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x32A JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x332 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x647341EB EQ PUSH2 0x2D9 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0x7833BEC0 EQ PUSH2 0x2EF JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x4303A542 GT PUSH2 0x171 JUMPI DUP1 PUSH4 0x586F84B2 GT PUSH2 0x14B JUMPI DUP1 PUSH4 0x586F84B2 EQ PUSH2 0x294 JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x2A9 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x2C6 JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x4303A542 EQ PUSH2 0x27C JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x284 JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x28C JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH4 0x2E1A7D4D GT PUSH2 0x1AD JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x219 JUMPI DUP1 PUSH4 0x3687617D EQ PUSH2 0x22C JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x24E JUMPI DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x26E JUMPI PUSH2 0x1CE JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x1D3 JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x1DD JUMPI DUP1 PUSH4 0x1310E444 EQ PUSH2 0x1F0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DB PUSH2 0x3B1 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xC35 JUMP JUMPDEST PUSH2 0x3EE JUMP JUMPDEST PUSH2 0x203 PUSH2 0x1FE CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x3F1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x12E4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1DB PUSH2 0x227 CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x3F8 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x23A CALLDATASIZE PUSH1 0x4 PUSH2 0xE62 JUMP JUMPDEST PUSH2 0x449 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x10B9 JUMP JUMPDEST PUSH2 0x261 PUSH2 0x25C CALLDATASIZE PUSH1 0x4 PUSH2 0xC72 JUMP JUMPDEST PUSH2 0x4E9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0xFFB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xCB5 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x5CB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x5D2 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x637 JUMP JUMPDEST PUSH2 0x29C PUSH2 0x669 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x126F JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x671 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x127A JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x679 JUMP JUMPDEST PUSH2 0x261 PUSH2 0x2D4 CALLDATASIZE PUSH1 0x4 PUSH2 0xBE3 JUMP JUMPDEST PUSH2 0x6DE JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xE2D JUMP JUMPDEST PUSH2 0x203 PUSH2 0x6E7 JUMP JUMPDEST PUSH2 0x302 PUSH2 0x2FD CALLDATASIZE PUSH1 0x4 PUSH2 0xD03 JUMP JUMPDEST PUSH2 0x6F5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x1183 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x7B2 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x325 CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x7B7 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x7BD JUMP JUMPDEST PUSH2 0x203 PUSH2 0x7C8 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xD9D JUMP JUMPDEST PUSH2 0x350 PUSH2 0x7CD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP3 SWAP2 SWAP1 PUSH2 0x12ED JUMP JUMPDEST PUSH2 0x366 PUSH2 0x806 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x101C JUMP JUMPDEST PUSH2 0x37B PUSH2 0x80B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x210 SWAP2 SWAP1 PUSH2 0x12D1 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x964 JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x39E CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH2 0x1EB JUMP JUMPDEST PUSH2 0x1DB PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0xCEA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E3 SWAP1 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST POP JUMP JUMPDEST POP PUSH2 0x7C7 SWAP1 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD PUSH2 0x43E SWAP2 SWAP1 PUSH2 0x12E4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE DUP3 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP4 ADD MSTORE DUP5 MLOAD DUP1 DUP7 ADD SWAP1 SWAP6 MSTORE SWAP2 DUP5 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP5 ADD MSTORE SWAP1 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x53A SWAP3 SWAP2 SWAP1 PUSH2 0xFD9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x575 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x109B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x597 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x7C7 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x3E3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x10FB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E3 SWAP1 PUSH2 0x1115 JUMP JUMPDEST PUSH2 0x5CF PUSH2 0x96A JUMP JUMPDEST PUSH2 0x5CF PUSH2 0x982 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x3E3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x10FB JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH2 0x6FD PUSH2 0x9A2 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE SWAP2 DUP3 MSTORE DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 MLOAD DUP1 DUP5 ADD DUP5 MSTORE DUP2 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP5 ADD MSTORE DUP5 DUP5 ADD MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP3 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x3EC JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x68656C6C6F000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1 SWAP2 JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH2 0x813 PUSH2 0x9D0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 DUP2 ADD SWAP1 SWAP4 MSTORE DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x829 JUMPI SWAP1 POP POP SWAP1 POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3078313233000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x883 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3078333231000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x8D1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x5 PUSH1 0x80 DUP3 ADD DUP2 DUP2 MSTORE PUSH32 0x3078313233000000000000000000000000000000000000000000000000000000 PUSH1 0xA0 DUP5 ADD MSTORE DUP3 MSTORE DUP2 DUP5 ADD MSTORE DUP1 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x6162630000000000000000000000000000000000000000000000000000000000 SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MSTORE SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x97D PUSH2 0x9FE JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x995 PUSH2 0x9D0 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x9B5 PUSH2 0xA11 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xA42 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xA58 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0xA67 DUP2 DUP3 DUP5 MUL ADD PUSH2 0x1306 JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xA9E JUMPI PUSH2 0xA8C DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0xAA9 JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xA75 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xAB9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xACF JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xB00 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1306 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xB17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB41 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xB4B PUSH1 0x80 PUSH2 0x1306 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xB66 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xB72 DUP7 DUP4 DUP8 ADD PUSH2 0xAA9 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0xB8C JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xBA5 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xBB1 DUP7 DUP4 DUP8 ADD PUSH2 0xA32 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xBC9 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xBD6 DUP6 DUP3 DUP7 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xBFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0xC06 DUP2 PUSH2 0x135D JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0xC24 DUP2 PUSH2 0x135D JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xC47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xC5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xA32 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xC88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xCA0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xCDE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD14 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xD2B JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x60 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xD3D JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xD47 PUSH1 0x60 PUSH2 0x1306 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xD5E JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xD6A DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xD81 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xD8D DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xDAE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xDC5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xDD7 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xDE1 PUSH1 0x40 PUSH2 0x1306 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xDF1 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xDFD DUP8 DUP3 DUP5 ADD PUSH2 0xB30 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xE11 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xE1D DUP8 DUP3 DUP5 ADD PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC6A DUP5 DUP3 DUP6 ADD PUSH2 0xB30 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xE76 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xE94 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xEA0 DUP8 DUP4 DUP9 ADD PUSH2 0xAA9 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xEB5 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xEC2 DUP7 DUP3 DUP8 ADD PUSH2 0xAA9 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0xEE4 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x132D JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0xF2B PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0xFB2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0xF9E DUP3 DUP3 MLOAD PUSH2 0xECC JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0xF64 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0xFCC DUP2 DUP8 PUSH2 0xECC JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0xFEB DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x132D JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x108E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x107C DUP6 DUP4 MLOAD PUSH2 0xF16 JUMP JUMPDEST SWAP5 POP SWAP3 DUP6 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1042 JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0x10CC PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0xECC JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x10DE DUP2 DUP7 PUSH2 0xECC JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x10F0 DUP2 DUP7 PUSH2 0xECC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x110E PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xECC JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE DUP1 MLOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x60 PUSH1 0xC0 DUP6 ADD MSTORE PUSH2 0x11B3 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 DUP6 DUP3 SUB ADD PUSH1 0xE0 DUP7 ADD MSTORE PUSH2 0x11EE DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST SWAP3 POP POP POP PUSH1 0x20 DUP5 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP1 DUP6 DUP5 SUB ADD PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x122C DUP4 DUP4 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD SWAP4 POP DUP2 DUP7 DUP3 SUB ADD PUSH1 0x60 DUP8 ADD MSTORE PUSH2 0x1247 DUP2 DUP6 PUSH2 0xECC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP7 ADD MLOAD SWAP3 POP DUP1 DUP6 DUP4 SUB ADD PUSH1 0x80 DUP7 ADD MSTORE POP PUSH2 0x1266 DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 MLOAD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1296 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0xF16 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x1266 DUP2 DUP4 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x110E PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xF16 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0xC6A PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0xECC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1325 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1348 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1330 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1357 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x3EE JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 PUSH4 0xECEA5975 PUSH21 0xF0F78A75668344FE0B439794CE207110B6D2E40D3 DIFFICULTY 0xb1 0xb7 PUSH9 0xD36C6578706572696D PUSH6 0x6E74616CF564 PUSH20 0x6F6C634300050B00400000000000000000000000 ", + "sourceMap": "641:6597:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:6597:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1496:107;;;:::i;:::-;;3294:63;;;;;;;;;:::i;6202:128::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2689:84;;;;;;;;;:::i;6825:345::-;;;;;;;;;:::i;:::-;;;;;;;;;;2288:334;;;;;;;;;:::i;:::-;;;;;;;;3132:52;;;;;;;5807:117;;;:::i;1389:101::-;;;:::i;1286:97::-;;;:::i;4505:153::-;;;:::i;:::-;;;;;;;;4237:73;;;:::i;:::-;;;;;;;;1609:111;;;:::i;2927:166::-;;;;;;;;;:::i;3503:52::-;;;;;;;4684:72;;;:::i;6403:317::-;;;;;;;;;:::i;:::-;;;;;;;;5616:112;;;:::i;989:140::-;;;;;;;;;:::i;4761:69::-;;;:::i;862:121::-;;;:::i;4168:64::-;;;;;;;4836:134;;;:::i;:::-;;;;;;;;;3993:80;;;:::i;:::-;;;;;;;;3637:350;;;:::i;:::-;;;;;;;;1135:145;;;:::i;6003:123::-;;;;;;;;;:::i;4976:47::-;;;;;;;1496:107;1564:32;;;;;;;;;;;;;;;;;;;;1496:107::o;3294:63::-;;:::o;6202:128::-;-1:-1:-1;6319:4:0;;6202:128::o;2689:84::-;2750:10;2739:27;;;2762:3;2739:27;;;;;;;;;;;;;;;2689:84;:::o;6825:345::-;-1:-1:-1;;7072:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6825:345:0:o;2288:334::-;2399:21;2436:19;:56;;;;;;;;;;;;;;;;;;;2502:20;2552:6;2560:4;2535:30;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2535:30:0;;;2525:41;;;;;;2502:64;;2583:32;2593:12;2607:1;2610;2613;2583:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2583:32:0;;;;;;2288:334;-1:-1:-1;;;;;;;;2288:334:0:o;5807:117::-;5913:4;5807:117;;:::o;1389:101::-;1469:13;;;;;;;;;;;;;;;;1462:21;;;;;;;1469:13;1462:21;;;;1286:97;1353:23;;;;;;;;;;;4505:153;4599:51;;:::i;4237:73::-;4287:19;;:::i;1609:111::-;1698:14;;;;;;;;;;;;;;;;1683:30;;;;;;;1698:14;1683:30;;;;2927:166;-1:-1:-1;3085:1:0;;2927:166;-1:-1:-1;;;2927:166:0:o;4684:72::-;4724:4;4739:14;;4752:1;4739:14;;;;;4684:72;:::o;6403:317::-;6517:20;;:::i;:::-;-1:-1:-1;6560:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6403:317::o;5616:112::-;5700:21;;989:140;1117:1;:5;;989:140::o;4761:69::-;4813:9;:14;;4826:1;4813:14;;;4761:69::o;862:121::-;975:1;862:121;:::o;4836:134::-;4944:19;;;;;;;;;;;;;;;;;4952:1;4836:134;:::o;3993:80::-;4054:15;3993:80;:::o;3637:350::-;3681:15;;:::i;:::-;3735:14;;;3747:1;3735:14;;;3708:24;3735:14;;;;;;;;;;;;;;;;;;;;;;;;;;3708:41;;3759:22;;;;;;;;;;;;;;;;;:9;3769:1;3759:12;;;;;;;;;;;;;:22;;;;3791;;;;;;;;;;;;;;;;;:9;3801:1;3791:12;;;;;;;;;;;;;;;;;;:22;;;;3831:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3831:149:0;;;;-1:-1:-1;3637:350:0;:::o;1135:145::-;711:4;1135:145;:::o;641:6597::-;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;158:685:-1:-;;276:3;269:4;261:6;257:17;253:27;243:2;;-1:-1;;284:12;243:2;331:6;318:20;31012:18;31004:6;31001:30;30998:2;;;-1:-1;;31034:12;30998:2;31079:4;353:81;31142:4;31079;31071:6;31067:17;31132:15;353:81;;;462:21;;;344:90;-1:-1;519:14;;;494:17;;;614:1;599:238;624:6;621:1;618:13;599:238;;;731:42;769:3;506:4;707:3;694:17;498:6;682:30;;731:42;;;719:55;;788:14;;;;816;;;;646:1;639:9;599:238;;;603:14;;;;;236:607;;;;;1706:432;;1803:3;1796:4;1788:6;1784:17;1780:27;1770:2;;-1:-1;;1811:12;1770:2;1858:6;1845:20;31619:18;31611:6;31608:30;31605:2;;;-1:-1;;31641:12;31605:2;1880:60;31782:4;31714:9;1796:4;31699:6;31695:17;31691:33;31772:15;1880:60;;;1871:69;;1960:6;1953:5;1946:21;2064:3;31782:4;2055:6;1988;2046:16;;2043:25;2040:2;;;2081:1;;2071:12;2040:2;36120:6;31782:4;1988:6;1984:17;31782:4;2022:5;2018:16;36097:30;36176:1;36158:16;;;31782:4;36158:16;36151:27;2022:5;1763:375;-1:-1;;1763:375;5221:1071;;5329:4;5317:9;5312:3;5308:19;5304:30;5301:2;;;-1:-1;;5337:12;5301:2;5365:20;5329:4;5365:20;;;5356:29;;5468:1;5453:17;5440:31;5491:18;;5483:6;5480:30;5477:2;;;5523:1;5520;5513:12;5477:2;5557:54;5607:3;5598:6;5587:9;5583:22;5557:54;;;5540:15;5533:79;5678:2;5735:9;5731:22;7616:20;7607:29;;35927:10;37234:5;35916:22;37210:5;37207:34;37197:2;;37255:1;37252;37245:12;37197:2;5711:48;5678:2;5697:5;5693:16;5686:74;5865:2;5854:9;5850:18;5837:32;5823:46;;5889:18;5881:6;5878:30;5875:2;;;5921:1;5918;5911:12;5875:2;5956:75;6027:3;6018:6;6007:9;6003:22;5956:75;;;5865:2;5942:5;5938:16;5931:101;6124:2;6113:9;6109:18;6096:32;6082:46;;6148:18;6140:6;6137:30;6134:2;;;6180:1;6177;6170:12;6134:2;;6215:55;6266:3;6257:6;6246:9;6242:22;6215:55;;;6124:2;6201:5;6197:16;6190:81;;;5295:997;;;;;7818:743;;;;;;7990:3;7978:9;7969:7;7965:23;7961:33;7958:2;;;-1:-1;;7997:12;7958:2;85:6;72:20;97:33;124:5;97:33;;;8049:63;-1:-1;8149:2;8188:22;;7480:20;;-1:-1;8257:2;8296:22;;7480:20;;-1:-1;8365:2;8404:22;;72:20;97:33;72:20;97:33;;;7952:609;;;;-1:-1;7952:609;;8473:3;8513:22;7480:20;;7952:609;-1:-1;;7952:609;8568:387;;8702:2;8690:9;8681:7;8677:23;8673:32;8670:2;;;-1:-1;;8708:12;8670:2;8766:17;8753:31;8804:18;8796:6;8793:30;8790:2;;;-1:-1;;8826:12;8790:2;8856:83;8931:7;8922:6;8911:9;8907:22;8856:83;;;8846:93;8664:291;-1:-1;;;;8664:291;8962:613;;;;;9115:3;9103:9;9094:7;9090:23;9086:33;9083:2;;;-1:-1;;9122:12;9083:2;1648:6;1635:20;9174:63;;9274:2;9315:9;9311:22;7750:20;36021:4;37354:5;36010:16;37331:5;37328:33;37318:2;;-1:-1;;37365:12;37318:2;9077:498;;9282:61;;-1:-1;;;;9380:2;9419:22;;1635:20;;9488:2;9527:22;1635:20;;9077:498;9582:345;;9695:2;9683:9;9674:7;9670:23;9666:32;9663:2;;;-1:-1;;9701:12;9663:2;9759:17;9746:31;9797:18;9789:6;9786:30;9783:2;;;-1:-1;;9819:12;9783:2;9849:62;9903:7;9894:6;9883:9;9879:22;9849:62;;9934:239;;10037:2;10025:9;10016:7;10012:23;10008:32;10005:2;;;-1:-1;;10043:12;10005:2;-1:-1;2661:20;;9999:174;-1:-1;9999:174;10534:385;;10667:2;10655:9;10646:7;10642:23;10638:32;10635:2;;;10683:1;10680;10673:12;10635:2;10731:17;10718:31;10769:18;;10761:6;10758:30;10755:2;;;10801:1;10798;10791:12;10755:2;10886:6;10875:9;10871:22;3780:4;3768:9;3763:3;3759:19;3755:30;3752:2;;;3798:1;3795;3788:12;3752:2;3816:20;3780:4;3816:20;;;3807:29;;7493:6;7480:20;3899:15;3892:74;10667:2;4043:9;4039:18;4026:32;4078:18;4070:6;4067:30;4064:2;;;4110:1;4107;4100:12;4064:2;4145:54;4195:3;4186:6;4175:9;4171:22;4145:54;;;10667:2;4131:5;4127:16;4120:80;;4288:2;4277:9;4273:18;4260:32;4312:18;4304:6;4301:30;4298:2;;;4344:1;4341;4334:12;4298:2;4379:55;4430:3;4421:6;4410:9;4406:22;4379:55;;;4288:2;4361:16;;4354:81;-1:-1;4365:5;;10629:290;-1:-1;;;;;10629:290;10926:385;;11059:2;11047:9;11038:7;11034:23;11030:32;11027:2;;;11075:1;11072;11065:12;11027:2;11123:17;11110:31;11161:18;;11153:6;11150:30;11147:2;;;11193:1;11190;11183:12;11147:2;11278:6;11267:9;11263:22;4619:4;4607:9;4602:3;4598:19;4594:30;4591:2;;;4637:1;4634;4627:12;4591:2;4655:20;4619:4;4655:20;;;4646:29;;4745:17;4732:31;4783:18;4775:6;4772:30;4769:2;;;4815:1;4812;4805:12;4769:2;4849:68;4913:3;4904:6;4893:9;4889:22;4849:68;;;4832:15;4825:93;;11059:2;5003:9;4999:18;4986:32;5038:18;5030:6;5027:30;5024:2;;;5070:1;5067;5060:12;5024:2;5105:55;5156:3;5147:6;5136:9;5132:22;5105:55;;;11059:2;5087:16;;5080:81;-1:-1;5091:5;;11021:290;-1:-1;;;;;11021:290;11318:373;;11445:2;11433:9;11424:7;11420:23;11416:32;11413:2;;;-1:-1;;11451:12;11413:2;11509:17;11496:31;11547:18;11539:6;11536:30;11533:2;;;-1:-1;;11569:12;11533:2;11599:76;11667:7;11658:6;11647:9;11643:22;11599:76;;11946:701;;;;12103:2;12091:9;12082:7;12078:23;12074:32;12071:2;;;12119:1;12116;12109:12;12071:2;7493:6;7480:20;12161:63;;12289:2;12278:9;12274:18;12261:32;12313:18;;12305:6;12302:30;12299:2;;;12345:1;12342;12335:12;12299:2;12365:62;12419:7;12410:6;12399:9;12395:22;12365:62;;;12355:72;;12492:2;12481:9;12477:18;12464:32;12450:46;;12516:18;12508:6;12505:30;12502:2;;;12548:1;12545;12538:12;12502:2;;12568:63;12623:7;12614:6;12603:9;12599:22;12568:63;;;12558:73;;;12065:582;;;;;;15443:343;;15585:5;33226:12;34312:6;34307:3;34300:19;15678:52;15723:6;34349:4;34344:3;34340:14;34349:4;15704:5;15700:16;15678:52;;;36638:2;36618:14;36634:7;36614:28;15742:39;;;;34349:4;15742:39;;15533:253;-1:-1;;15533:253;22246:1078;;22470:15;22464:22;22393:4;22506:13;22499:37;22551:67;22393:4;22388:3;22384:14;22599:12;22551:67;;;22708:4;;;35927:10;22708:4;22701:5;22697:16;22691:23;35916:22;22775:4;22770:3;22766:14;24752:36;22876:4;22869:5;22865:16;22859:23;22928:3;22922:4;22918:14;22876:4;22906:3;22902:14;22895:38;22948:109;13419:5;33226:12;34312:6;34307:3;34300:19;34349:4;34344:3;34340:14;13431:88;;22708:4;13584;13576:6;13572:17;34344:3;13563:27;;32911:4;13662:5;32902:14;-1:-1;13707:10;;13701:341;13726:6;13723:1;13720:13;13701:341;;;13778:20;34344:3;13782:4;13778:20;;13773:3;13766:33;12766:60;12822:3;13833:6;13827:13;12766:60;;;13748:1;13741:9;;;;;14021:14;;;;13847:82;-1:-1;34026:14;;13701:341;;;13705:14;23145:4;23138:5;23134:16;23128:23;23108:43;;23197:3;23191:4;23187:14;23145:4;23175:3;23171:14;23164:38;23217:69;23281:4;23267:12;23217:69;;;23308:11;22366:958;-1:-1;;;;;;;;;22366:958;24914:401;;15953:5;33226:12;16064:52;16109:6;16104:3;16097:4;16090:5;16086:16;16064:52;;;16128:16;;;;15235:37;;;-1:-1;16097:4;25278:12;;25067:248;-1:-1;25067:248;25322:213;35721:42;35710:54;;;;13153:37;;25440:2;25425:18;;25411:124;25542:437;;25748:2;;25737:9;25733:18;25788:20;25769:17;25762:47;25823:146;14406:5;33226:12;34312:6;34307:3;34300:19;34340:14;25737:9;34340:14;14418:112;;34340:14;14595:4;14587:6;14583:17;25737:9;14574:27;;14562:39;;32911:4;14691:5;32902:14;-1:-1;14730:387;14755:6;14752:1;14749:13;14730:387;;;14807:20;25737:9;14811:4;14807:20;;14802:3;14795:33;12980:88;13064:3;14862:6;14856:13;12980:88;;;14876:110;-1:-1;15096:14;;;;34026;;;;14777:1;14770:9;14730:387;;;-1:-1;25815:154;;25719:260;-1:-1;;;;;;;25719:260;25986:539;15235:37;;;36021:4;36010:16;;;;26345:2;26330:18;;24867:35;26428:2;26413:18;;15235:37;26511:2;26496:18;;15235:37;26184:3;26169:19;;26155:370;26532:691;;26762:2;26783:17;26776:47;26837:76;26762:2;26751:9;26747:18;26899:6;26837:76;;;26961:9;26955:4;26951:20;26946:2;26935:9;26931:18;26924:48;26986:76;27057:4;27048:6;26986:76;;;27110:9;27104:4;27100:20;27095:2;27084:9;27080:18;27073:48;27135:78;27208:4;27199:6;27135:78;;;27127:86;26733:490;-1:-1;;;;;;;26733:490;27230:293;;27364:2;27385:17;27378:47;27439:74;27364:2;27353:9;27349:18;27499:6;27439:74;;;27431:82;27335:188;-1:-1;;;27335:188;27530:407;27721:2;27735:47;;;17729:2;27706:18;;;34300:19;17765:66;34340:14;;;17745:87;17851:12;;;27692:245;27944:407;28135:2;28149:47;;;18102:2;28120:18;;;34300:19;18138:66;34340:14;;;18118:87;18224:12;;;28106:245;28358:381;;28536:2;28557:17;28550:47;19419:15;19413:22;19346:4;28536:2;28525:9;28521:18;19448:37;18539:15;18533:22;19337:14;28525:9;19337:14;15235:37;28536:2;18694:5;18690:16;18684:23;18468:4;18727:14;28525:9;18727:14;18720:38;18773:67;18459:14;28525:9;18459:14;18821:12;18773:67;;;18924:4;18917:5;18913:16;18907:23;18887:43;;18966:14;28525:9;18970:4;18966:14;;18950;28525:9;18950:14;18943:38;18996:69;19060:4;19046:12;18996:69;;;19087:11;;;;28536:2;19686:5;19682:16;19676:23;19735:14;;28525:9;19739:4;19735:14;;18924:4;28525:9;19719:14;19712:38;19765:67;19827:4;19813:12;19765:67;;;18924:4;19911:5;19907:16;19901:23;19881:43;;19960:14;28525:9;19964:4;19960:14;;18468:4;28525:9;19944:14;19937:38;19990:67;20052:4;20038:12;19990:67;;;19982:75;;;18468:4;20136:5;20132:16;20126:23;20106:43;;20185:14;28525:9;20189:4;20185:14;;19346:4;28525:9;20169:14;20162:38;;20215:69;20279:4;20265:12;20215:69;;;28603:126;28507:232;-1:-1;;;;;28507:232;28746:453;20750:22;;22067;15235:37;;28984:2;28969:18;;28955:244;29206:377;;29382:2;29403:17;29396:47;21267:15;21261:22;21188:4;29382:2;29371:9;29367:18;21296:37;21348:95;21179:14;29371:9;21179:14;21424:12;21348:95;;;29382:2;21528:5;21524:16;21518:23;21498:43;;21577:14;29371:9;21581:4;21577:14;;21188:4;29371:9;21561:14;21554:38;21607:69;21671:4;21657:12;21607:69;;29590:353;;29754:2;29775:17;29768:47;29829:104;29754:2;29743:9;29739:18;29919:6;29829:104;;29950:213;15235:37;;;30068:2;30053:18;;30039:124;30170:412;;15265:5;15242:3;15235:37;30336:2;30454;30443:9;30439:18;30432:48;30494:78;30336:2;30325:9;30321:18;30558:6;30494:78;;30589:256;30651:2;30645:9;30677:17;;;30752:18;30737:34;;30773:22;;;30734:62;30731:2;;;30809:1;;30799:12;30731:2;30651;30818:22;30629:216;;-1:-1;30629:216;36193:268;36258:1;36265:101;36279:6;36276:1;36273:13;36265:101;;;36346:11;;;36340:18;36327:11;;;36320:39;36301:2;36294:10;36265:101;;;36381:6;36378:1;36375:13;36372:2;;;36258:1;36437:6;36432:3;36428:16;36421:27;36372:2;;36242:219;;;;36655:117;35721:42;36742:5;35710:54;36717:5;36714:35;36704:2;;36763:1;;36753:12" } } }, @@ -718,12 +798,12 @@ } }, "sourceCodes": { - "AbiGenDummy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma experimental ABIEncoderV2;\n\npragma solidity ^0.5.5;\n\n\ncontract AbiGenDummy\n{\n\n uint256 constant internal SOME_CONSTANT = 1234;\n string constant internal REVERT_REASON = \"REVERT_WITH_CONSTANT\";\n string constant internal REQUIRE_REASON = \"REQUIRE_WITH_CONSTANT\";\n\n function simplePureFunction ()\n public\n pure\n returns (uint256 result)\n {\n return 1;\n }\n\n function simplePureFunctionWithInput (uint256 x)\n public\n pure\n returns (uint256 sum)\n {\n return 1 + x;\n }\n\n function pureFunctionWithConstant ()\n public\n pure\n returns (uint256 someConstant)\n {\n return SOME_CONSTANT;\n }\n\n function simpleRevert ()\n public\n pure\n {\n revert(\"SIMPLE_REVERT\");\n }\n\n function revertWithConstant ()\n public\n pure\n {\n revert(REVERT_REASON);\n }\n\n function simpleRequire ()\n public\n pure\n {\n require(0 > 1, \"SIMPLE_REQUIRE\");\n }\n\n function requireWithConstant ()\n public\n pure\n {\n require(0 > 1, REQUIRE_REASON);\n }\n\n /// @dev test that devdocs will be generated and\n /// that multiline devdocs will look okay\n /// @param hash description of some hash. Let's make this line super long to demonstrate hanging indents for method params. It has to be more than one hundred twenty columns.\n /// @param v some v, recovery id\n /// @param r ECDSA r output\n /// @param s ECDSA s output\n /// @return the signerAddress that created this signature\n function ecrecoverFn(bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n public\n pure\n returns (address signerAddress)\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, hash));\n return ecrecover(prefixedHash, v, r, s);\n }\n\n event Withdrawal(address indexed _owner, uint _value);\n\n function withdraw(uint wad) public {\n emit Withdrawal(msg.sender, wad);\n }\n\n // test: generated code should normalize address inputs to lowercase\n // add extra inputs to make sure it works with address in any position\n function withAddressInput(address x, uint256 a, uint256 b, address y, uint256 c)\n public\n pure\n returns (address z)\n {\n return x;\n }\n\n event AnEvent(uint8 param);\n\n function acceptsBytes(bytes memory a) public pure {}\n\n /// @dev a method that accepts an array of bytes\n /// @param a the array of bytes being accepted\n function acceptsAnArrayOfBytes(bytes[] memory a) public pure {}\n\n struct Struct {\n bytes someBytes;\n uint32 anInteger;\n bytes[] aDynamicArrayOfBytes;\n string aString;\n }\n\n function structInput(Struct memory s) public pure {}\n\n /// @dev a method that returns a struct\n /// @return a Struct struct\n function structOutput() public pure returns(Struct memory s) {\n bytes[] memory byteArray = new bytes[](2);\n byteArray[0] = '0x123';\n byteArray[1] = '0x321';\n\n return Struct({\n someBytes: '0x123',\n anInteger: 5,\n aDynamicArrayOfBytes: byteArray,\n aString: \"abc\"\n });\n }\n\n function methodReturningArrayOfStructs() public pure returns(Struct[] memory) {}\n\n struct NestedStruct {\n Struct innerStruct;\n string description;\n }\n\n function nestedStructInput(NestedStruct memory n) public pure {}\n function nestedStructOutput() public pure returns(NestedStruct memory) {}\n\n struct StructNotDirectlyUsedAnywhere {\n uint256 aField;\n }\n\n struct NestedStructWithInnerStructNotUsedElsewhere {\n StructNotDirectlyUsedAnywhere innerStruct;\n }\n\n function methodUsingNestedStructWithInnerStructNotUsedElsewhere()\n public pure returns(NestedStructWithInnerStructNotUsedElsewhere memory)\n {}\n\n uint someState;\n function nonPureMethod() public returns(uint) { return someState += 1; }\n function nonPureMethodThatReturnsNothing() public { someState += 1; }\n\n function methodReturningMultipleValues()\n public pure returns (uint256, string memory)\n {\n return (1, \"hello\");\n }\n\n function overloadedMethod(int a) public pure {}\n function overloadedMethod(string memory a) public pure {}\n \n // begin tests for `decodeTransactionData`, `decodeReturnData`\n\n /// @dev complex input is dynamic and more difficult to decode than simple input.\n struct ComplexInput {\n uint256 foo;\n bytes bar;\n string car;\n }\n\n /// @dev complex input is dynamic and more difficult to decode than simple input.\n struct ComplexOutput {\n ComplexInput input;\n bytes lorem;\n bytes ipsum;\n string dolor;\n }\n \n /// @dev Tests decoding when both input and output are empty.\n function noInputNoOutput()\n public\n pure\n {\n // NOP\n require(true == true);\n }\n\n /// @dev Tests decoding when input is empty and output is non-empty.\n function noInputSimpleOutput()\n public\n pure\n returns (uint256)\n {\n return 1991;\n }\n\n /// @dev Tests decoding when input is not empty but output is empty.\n function simpleInputNoOutput(uint256)\n public\n pure\n {\n // NOP\n require(true == true);\n }\n\n /// @dev Tests decoding when both input and output are non-empty.\n function simpleInputSimpleOutput(uint256)\n public\n pure\n returns (uint256)\n {\n return 1991;\n }\n\n /// @dev Tests decoding when the input and output are complex.\n function complexInputComplexOutput(ComplexInput memory complexInput)\n public\n pure\n returns (ComplexOutput memory)\n {\n return ComplexOutput({\n input: complexInput,\n lorem: hex'12345678',\n ipsum: hex'87654321',\n dolor: \"amet\"\n });\n }\n\n /// @dev Tests decoding when the input and output are complex and have more than one argument.\n function multiInputMultiOutput(\n uint256,\n bytes memory,\n string memory\n )\n public\n pure\n returns (\n bytes memory,\n bytes memory,\n string memory\n )\n {\n return (\n hex'12345678',\n hex'87654321',\n \"amet\"\n );\n }\n\n // end tests for `decodeTransactionData`, `decodeReturnData`\n}\n" + "AbiGenDummy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma experimental ABIEncoderV2;\n\npragma solidity ^0.5.5;\n\n\ncontract AbiGenDummy\n{\n\n uint256 constant internal SOME_CONSTANT = 1234;\n string constant internal REVERT_REASON = \"REVERT_WITH_CONSTANT\";\n string constant internal REQUIRE_REASON = \"REQUIRE_WITH_CONSTANT\";\n\n function simplePureFunction ()\n public\n pure\n returns (uint256 result)\n {\n return 1;\n }\n\n function simplePureFunctionWithInput (uint256 x)\n public\n pure\n returns (uint256 sum)\n {\n return 1 + x;\n }\n\n function pureFunctionWithConstant ()\n public\n pure\n returns (uint256 someConstant)\n {\n return SOME_CONSTANT;\n }\n\n function simpleRevert ()\n public\n pure\n {\n revert(\"SIMPLE_REVERT\");\n }\n\n function revertWithConstant ()\n public\n pure\n {\n revert(REVERT_REASON);\n }\n\n function simpleRequire ()\n public\n pure\n {\n require(0 > 1, \"SIMPLE_REQUIRE\");\n }\n\n function requireWithConstant ()\n public\n pure\n {\n require(0 > 1, REQUIRE_REASON);\n }\n\n /// @dev test that devdocs will be generated and\n /// that multiline devdocs will look okay\n /// @param hash description of some hash. Let's make this line super long to demonstrate hanging indents for method params. It has to be more than one hundred twenty columns.\n /// @param v some v, recovery id\n /// @param r ECDSA r output\n /// @param s ECDSA s output\n /// @return the signerAddress that created this signature. this line too is super long in order to demonstrate the proper hanging indentation in generated code.\n function ecrecoverFn(bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n public\n pure\n returns (address signerAddress)\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, hash));\n return ecrecover(prefixedHash, v, r, s);\n }\n\n event Withdrawal(address indexed _owner, uint _value);\n\n function withdraw(uint wad) public {\n emit Withdrawal(msg.sender, wad);\n }\n\n // test: generated code should normalize address inputs to lowercase\n // add extra inputs to make sure it works with address in any position\n function withAddressInput(address x, uint256 a, uint256 b, address y, uint256 c)\n public\n pure\n returns (address z)\n {\n return x;\n }\n\n event AnEvent(uint8 param);\n\n function acceptsBytes(bytes memory a) public pure {}\n\n /// @dev a method that accepts an array of bytes\n /// @param a the array of bytes being accepted\n function acceptsAnArrayOfBytes(bytes[] memory a) public pure {}\n\n struct Struct {\n bytes someBytes;\n uint32 anInteger;\n bytes[] aDynamicArrayOfBytes;\n string aString;\n }\n\n function structInput(Struct memory s) public pure {}\n\n /// @dev a method that returns a struct\n /// @return a Struct struct\n function structOutput() public pure returns(Struct memory s) {\n bytes[] memory byteArray = new bytes[](2);\n byteArray[0] = '0x123';\n byteArray[1] = '0x321';\n\n return Struct({\n someBytes: '0x123',\n anInteger: 5,\n aDynamicArrayOfBytes: byteArray,\n aString: \"abc\"\n });\n }\n\n function methodReturningArrayOfStructs() public pure returns(Struct[] memory) {}\n\n struct NestedStruct {\n Struct innerStruct;\n string description;\n }\n\n function nestedStructInput(NestedStruct memory n) public pure {}\n function nestedStructOutput() public pure returns(NestedStruct memory) {}\n\n struct StructNotDirectlyUsedAnywhere {\n uint256 aField;\n }\n\n struct NestedStructWithInnerStructNotUsedElsewhere {\n StructNotDirectlyUsedAnywhere innerStruct;\n }\n\n function methodUsingNestedStructWithInnerStructNotUsedElsewhere()\n public pure returns(NestedStructWithInnerStructNotUsedElsewhere memory)\n {}\n\n uint someState;\n function nonPureMethod() public returns(uint) { return someState += 1; }\n function nonPureMethodThatReturnsNothing() public { someState += 1; }\n\n function methodReturningMultipleValues()\n public pure returns (uint256, string memory)\n {\n return (1, \"hello\");\n }\n\n function overloadedMethod(int a) public pure {}\n function overloadedMethod(string memory a) public pure {}\n\n // begin tests for `decodeTransactionData`, `decodeReturnData`\n\n /// @dev complex input is dynamic and more difficult to decode than simple input.\n struct ComplexInput {\n uint256 foo;\n bytes bar;\n string car;\n }\n\n /// @dev complex input is dynamic and more difficult to decode than simple input.\n struct ComplexOutput {\n ComplexInput input;\n bytes lorem;\n bytes ipsum;\n string dolor;\n }\n\n /// @dev Tests decoding when both input and output are empty.\n function noInputNoOutput()\n public\n pure\n {\n // NOP\n require(true == true);\n }\n\n /// @dev Tests decoding when input is empty and output is non-empty.\n function noInputSimpleOutput()\n public\n pure\n returns (uint256)\n {\n return 1991;\n }\n\n /// @dev Tests decoding when input is not empty but output is empty.\n function simpleInputNoOutput(uint256)\n public\n pure\n {\n // NOP\n require(true == true);\n }\n\n /// @dev Tests decoding when both input and output are non-empty.\n function simpleInputSimpleOutput(uint256)\n public\n pure\n returns (uint256)\n {\n return 1991;\n }\n\n /// @dev Tests decoding when the input and output are complex.\n function complexInputComplexOutput(ComplexInput memory complexInput)\n public\n pure\n returns (ComplexOutput memory)\n {\n return ComplexOutput({\n input: complexInput,\n lorem: hex'12345678',\n ipsum: hex'87654321',\n dolor: \"amet\"\n });\n }\n\n /// @dev Tests decoding when the input and output are complex and have more than one argument.\n function multiInputMultiOutput(\n uint256,\n bytes memory,\n string memory\n )\n public\n pure\n returns (\n bytes memory,\n bytes memory,\n string memory\n )\n {\n return (\n hex'12345678',\n hex'87654321',\n \"amet\"\n );\n }\n\n // end tests for `decodeTransactionData`, `decodeReturnData`\n}\n" }, - "sourceTreeHashHex": "0x83b4faf1de287d381981daf81b90628e9aede5c6265e90436c477c8bc9062991", + "sourceTreeHashHex": "0x04023fa7383c3870731c03506094542290fbb4225730af5a7cdbf1ce6396606b", "compiler": { "name": "solc", - "version": "soljson-v0.5.10+commit.5a6ea5b1.js", + "version": "soljson-v0.5.11+commit.c082d0b4.js", "settings": { "optimizer": { "enabled": true, diff --git a/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol b/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol index 5b56bdfcce..212c8679b6 100644 --- a/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol +++ b/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol @@ -86,7 +86,7 @@ contract AbiGenDummy /// @param v some v, recovery id /// @param r ECDSA r output /// @param s ECDSA s output - /// @return the signerAddress that created this signature + /// @return the signerAddress that created this signature. this line too is super long in order to demonstrate the proper hanging indentation in generated code. function ecrecoverFn(bytes32 hash, uint8 v, bytes32 r, bytes32 s) public pure @@ -179,7 +179,7 @@ contract AbiGenDummy function overloadedMethod(int a) public pure {} function overloadedMethod(string memory a) public pure {} - + // begin tests for `decodeTransactionData`, `decodeReturnData` /// @dev complex input is dynamic and more difficult to decode than simple input. @@ -196,7 +196,7 @@ contract AbiGenDummy bytes ipsum; string dolor; } - + /// @dev Tests decoding when both input and output are empty. function noInputNoOutput() public diff --git a/packages/contract-addresses/CHANGELOG.json b/packages/contract-addresses/CHANGELOG.json index bfa6a8eb2b..ea304f746c 100644 --- a/packages/contract-addresses/CHANGELOG.json +++ b/packages/contract-addresses/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "3.1.0", + "changes": [ + { + "note": "Added DevUtils", + "pr": 2060 + } + ] + }, { "version": "3.0.3", "changes": [ diff --git a/packages/contract-addresses/src/index.ts b/packages/contract-addresses/src/index.ts index 6fb7d8691f..94c7a467b3 100644 --- a/packages/contract-addresses/src/index.ts +++ b/packages/contract-addresses/src/index.ts @@ -15,6 +15,7 @@ export interface ContractAddresses { multiAssetProxy: string; staticCallProxy: string; erc1155Proxy: string; + devUtils: string; } export enum NetworkId { @@ -43,6 +44,7 @@ const networkToAddresses: { [networkId: number]: ContractAddresses } = { multiAssetProxy: '0xef701d5389ae74503d633396c4d654eabedc9d78', staticCallProxy: '0x3517b88c19508c08650616019062b898ab65ed29', erc1155Proxy: '0x7eefbd48fd63d441ec7435d024ec7c5131019add', + devUtils: '0x92d9a4d50190ae04e03914db2ee650124af844e6', }, 3: { erc20Proxy: '0xb1408f4c245a23c31b98d2c626777d4c0d766caa', @@ -59,6 +61,7 @@ const networkToAddresses: { [networkId: number]: ContractAddresses } = { multiAssetProxy: '0xab8fbd189c569ccdee3a4d929bb7f557be4028f6', staticCallProxy: '0xe1b97e47aa3796276033a5341e884d2ba46b6ac1', erc1155Proxy: '0x19bb6caa3bc34d39e5a23cedfa3e6c7e7f3c931d', + devUtils: '0x3e0b46bad8e374e4a110c12b832cb120dbe4a479', }, 4: { exchange: '0xbff9493f92a3df4b0429b6d00743b3cfb4c85831', @@ -75,6 +78,7 @@ const networkToAddresses: { [networkId: number]: ContractAddresses } = { multiAssetProxy: '0xb34cde0ad3a83d04abebc0b66e75196f22216621', staticCallProxy: '0xe1b97e47aa3796276033a5341e884d2ba46b6ac1', erc1155Proxy: '0x19bb6caa3bc34d39e5a23cedfa3e6c7e7f3c931d', + devUtils: '0x2d4a9abda7b8b3605c8dbd34e3550a7467c78287', }, 42: { erc20Proxy: '0xf1ec01d6236d3cd881a0bf0130ea25fe4234003e', @@ -91,6 +95,7 @@ const networkToAddresses: { [networkId: number]: ContractAddresses } = { multiAssetProxy: '0xf6313a772c222f51c28f2304c0703b8cf5428fd8', staticCallProxy: '0x48e94bdb9033640d45ea7c721e25f380f8bffa43', erc1155Proxy: '0x64517fa2b480ba3678a2a3c0cf08ef7fd4fad36f', + devUtils: '0x1e3616bc5144362f95d72de41874395567697e93', }, // NetworkId 50 represents our Ganache snapshot generated from migrations. 50: { @@ -108,6 +113,7 @@ const networkToAddresses: { [networkId: number]: ContractAddresses } = { coordinator: '0x0d8b0dd11f5d34ed41d556def5f841900d5b1c6b', multiAssetProxy: '0xcfc18cec799fbd1793b5c43e773c98d4d61cc2db', staticCallProxy: '0x6dfff22588be9b3ef8cf0ad6dc9b84796f9fb45f', + devUtils: '0x38ef19fdf8e8415f18c307ed71967e19aac28ba1', }, }; diff --git a/packages/contract-artifacts/CHANGELOG.json b/packages/contract-artifacts/CHANGELOG.json index 959535fc07..71ee909a94 100644 --- a/packages/contract-artifacts/CHANGELOG.json +++ b/packages/contract-artifacts/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "2.1.0", + "changes": [ + { + "note": "Added DevUtils", + "pr": 2060 + } + ] + }, { "timestamp": 1565296576, "version": "2.0.4", diff --git a/packages/contract-artifacts/artifacts/DevUtils.json b/packages/contract-artifacts/artifacts/DevUtils.json new file mode 100644 index 0000000000..58e6484998 --- /dev/null +++ b/packages/contract-artifacts/artifacts/DevUtils.json @@ -0,0 +1,501 @@ +{ + "schemaVersion": "2.0.0", + "contractName": "DevUtils", + "compilerOutput": { + "abi": [ + { + "constant": true, + "inputs": [{ "name": "assetData", "type": "bytes" }], + "name": "decodeERC721AssetData", + "outputs": [ + { "name": "assetProxyId", "type": "bytes4" }, + { "name": "tokenAddress", "type": "address" }, + { "name": "tokenId", "type": "uint256" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes" }], + "name": "getBalanceAndAssetProxyAllowance", + "outputs": [{ "name": "balance", "type": "uint256" }, { "name": "allowance", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "ERC1155_PROXY_ID", + "outputs": [{ "name": "", "type": "bytes4" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes" }], + "name": "getTransferableAssetAmount", + "outputs": [{ "name": "transferableAssetAmount", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes[]" }], + "name": "getBatchAssetProxyAllowances", + "outputs": [{ "name": "allowances", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "tokenAddress", "type": "address" }], + "name": "encodeERC20AssetData", + "outputs": [{ "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "transactionData", "type": "bytes" }], + "name": "decodeZeroExTransactionData", + "outputs": [ + { "name": "functionName", "type": "string" }, + { + "components": [ + { "name": "makerAddress", "type": "address" }, + { "name": "takerAddress", "type": "address" }, + { "name": "feeRecipientAddress", "type": "address" }, + { "name": "senderAddress", "type": "address" }, + { "name": "makerAssetAmount", "type": "uint256" }, + { "name": "takerAssetAmount", "type": "uint256" }, + { "name": "makerFee", "type": "uint256" }, + { "name": "takerFee", "type": "uint256" }, + { "name": "expirationTimeSeconds", "type": "uint256" }, + { "name": "salt", "type": "uint256" }, + { "name": "makerAssetData", "type": "bytes" }, + { "name": "takerAssetData", "type": "bytes" } + ], + "name": "orders", + "type": "tuple[]" + }, + { "name": "takerAssetFillAmounts", "type": "uint256[]" }, + { "name": "signatures", "type": "bytes[]" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes" }], + "name": "getBalance", + "outputs": [{ "name": "balance", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { "name": "makerAddress", "type": "address" }, + { "name": "takerAddress", "type": "address" }, + { "name": "feeRecipientAddress", "type": "address" }, + { "name": "senderAddress", "type": "address" }, + { "name": "makerAssetAmount", "type": "uint256" }, + { "name": "takerAssetAmount", "type": "uint256" }, + { "name": "makerFee", "type": "uint256" }, + { "name": "takerFee", "type": "uint256" }, + { "name": "expirationTimeSeconds", "type": "uint256" }, + { "name": "salt", "type": "uint256" }, + { "name": "makerAssetData", "type": "bytes" }, + { "name": "takerAssetData", "type": "bytes" } + ], + "name": "orders", + "type": "tuple[]" + }, + { "name": "signatures", "type": "bytes[]" } + ], + "name": "getOrderRelevantStates", + "outputs": [ + { + "components": [ + { "name": "orderStatus", "type": "uint8" }, + { "name": "orderHash", "type": "bytes32" }, + { "name": "orderTakerAssetFilledAmount", "type": "uint256" } + ], + "name": "ordersInfo", + "type": "tuple[]" + }, + { "name": "fillableTakerAssetAmounts", "type": "uint256[]" }, + { "name": "isValidSignature", "type": "bool[]" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "ERC20_PROXY_ID", + "outputs": [{ "name": "", "type": "bytes4" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "assetData", "type": "bytes" }], + "name": "decodeERC20AssetData", + "outputs": [ + { "name": "assetProxyId", "type": "bytes4" }, + { "name": "tokenAddress", "type": "address" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "components": [ + { "name": "makerAddress", "type": "address" }, + { "name": "takerAddress", "type": "address" }, + { "name": "feeRecipientAddress", "type": "address" }, + { "name": "senderAddress", "type": "address" }, + { "name": "makerAssetAmount", "type": "uint256" }, + { "name": "takerAssetAmount", "type": "uint256" }, + { "name": "makerFee", "type": "uint256" }, + { "name": "takerFee", "type": "uint256" }, + { "name": "expirationTimeSeconds", "type": "uint256" }, + { "name": "salt", "type": "uint256" }, + { "name": "makerAssetData", "type": "bytes" }, + { "name": "takerAssetData", "type": "bytes" } + ], + "name": "order", + "type": "tuple" + }, + { "name": "signature", "type": "bytes" } + ], + "name": "getOrderRelevantState", + "outputs": [ + { + "components": [ + { "name": "orderStatus", "type": "uint8" }, + { "name": "orderHash", "type": "bytes32" }, + { "name": "orderTakerAssetFilledAmount", "type": "uint256" } + ], + "name": "orderInfo", + "type": "tuple" + }, + { "name": "fillableTakerAssetAmount", "type": "uint256" }, + { "name": "isValidSignature", "type": "bool" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "assetData", "type": "bytes" }], + "name": "decodeERC1155AssetData", + "outputs": [ + { "name": "assetProxyId", "type": "bytes4" }, + { "name": "tokenAddress", "type": "address" }, + { "name": "tokenIds", "type": "uint256[]" }, + { "name": "tokenValues", "type": "uint256[]" }, + { "name": "callbackData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "addresses", "type": "address[]" }], + "name": "getEthBalances", + "outputs": [{ "name": "", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "ERC721_PROXY_ID", + "outputs": [{ "name": "", "type": "bytes4" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "tokenAddress", "type": "address" }, { "name": "tokenId", "type": "uint256" }], + "name": "encodeERC721AssetData", + "outputs": [{ "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MULTI_ASSET_PROXY_ID", + "outputs": [{ "name": "", "type": "bytes4" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "name": "tokenAddress", "type": "address" }, + { "name": "tokenIds", "type": "uint256[]" }, + { "name": "tokenValues", "type": "uint256[]" }, + { "name": "callbackData", "type": "bytes" } + ], + "name": "encodeERC1155AssetData", + "outputs": [{ "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "tokenAddress", "type": "address" }, { "name": "tokenId", "type": "uint256" }], + "name": "getERC721TokenOwner", + "outputs": [{ "name": "ownerAddress", "type": "address" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "assetData", "type": "bytes" }], + "name": "decodeMultiAssetData", + "outputs": [ + { "name": "assetProxyId", "type": "bytes4" }, + { "name": "amounts", "type": "uint256[]" }, + { "name": "nestedAssetData", "type": "bytes[]" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes[]" }], + "name": "getBatchBalances", + "outputs": [{ "name": "balances", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes" }], + "name": "getAssetProxyAllowance", + "outputs": [{ "name": "allowance", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "name": "amounts", "type": "uint256[]" }, + { "name": "nestedAssetData", "type": "bytes[]" } + ], + "name": "encodeMultiAssetData", + "outputs": [{ "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "STATIC_CALL_PROXY_ID", + "outputs": [{ "name": "", "type": "bytes4" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes[]" }], + "name": "getBatchBalancesAndAssetProxyAllowances", + "outputs": [{ "name": "balances", "type": "uint256[]" }, { "name": "allowances", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "name": "_exchange", "type": "address" }, { "name": "_zrxAssetData", "type": "bytes" }], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + } + ], + "devdoc": { + "methods": { + "decodeERC1155AssetData(bytes)": { + "details": "Decode ERC-1155 asset data from the format described in the AssetProxy contract specification.", + "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-1155 set of assets." }, + "return": "The ERC-1155 AssetProxy identifier, the address of the ERC-1155 contract hosting the assets, an array of the identifiers of the assets to be traded, an array of asset amounts to be traded, and callback data. Each element of the arrays corresponds to the same-indexed element of the other array. Return values specified as `memory` are returned as pointers to locations within the memory of the input parameter `assetData`." + }, + "decodeERC20AssetData(bytes)": { + "details": "Decode ERC-20 asset data from the format described in the AssetProxy contract specification.", + "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-20 asset." }, + "return": "The ERC-20 AssetProxy identifier, and the address of the ERC-20 contract hosting this asset." + }, + "decodeERC721AssetData(bytes)": { + "details": "Decode ERC-721 asset data from the format described in the AssetProxy contract specification.", + "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-721 asset." }, + "return": "The ERC-721 AssetProxy identifier, the address of the ERC-721 contract hosting this asset, and the identifier of the specific asset to be traded." + }, + "decodeMultiAssetData(bytes)": { + "details": "Decode multi-asset data from the format described in the AssetProxy contract specification.", + "params": { "assetData": "AssetProxy-compliant data describing a multi-asset basket." }, + "return": "The Multi-Asset AssetProxy identifier, an array of the amounts of the assets to be traded, and an array of the AssetProxy-compliant data describing each asset to be traded. Each element of the arrays corresponds to the same-indexed element of the other array." + }, + "decodeZeroExTransactionData(bytes)": { + "details": "Decodes the call data for an Exchange contract method call.", + "params": { "transactionData": "ABI-encoded calldata for an Exchange contract method call." }, + "return": "The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element." + }, + "encodeERC1155AssetData(address,uint256[],uint256[],bytes)": { + "details": "Encode ERC-1155 asset data into the format described in the AssetProxy contract specification.", + "params": { + "callbackData": "Data to be passed to receiving contracts when a transfer is performed.", + "tokenAddress": "The address of the ERC-1155 contract hosting the asset(s) to be traded.", + "tokenIds": "The identifiers of the specific assets to be traded.", + "tokenValues": "The amounts of each asset to be traded." + }, + "return": "AssetProxy-compliant asset data describing the set of assets." + }, + "encodeERC20AssetData(address)": { + "details": "Encode ERC-20 asset data into the format described in the AssetProxy contract specification.", + "params": { "tokenAddress": "The address of the ERC-20 contract hosting the asset to be traded." }, + "return": "AssetProxy-compliant data describing the asset." + }, + "encodeERC721AssetData(address,uint256)": { + "details": "Encode ERC-721 asset data into the format described in the AssetProxy specification.", + "params": { + "tokenAddress": "The address of the ERC-721 contract hosting the asset to be traded.", + "tokenId": "The identifier of the specific asset to be traded." + }, + "return": "AssetProxy-compliant asset data describing the asset." + }, + "encodeMultiAssetData(uint256[],bytes[])": { + "details": "Encode data for multiple assets, per the AssetProxy contract specification.", + "params": { + "amounts": "The amounts of each asset to be traded.", + "nestedAssetData": "AssetProxy-compliant data describing each asset to be traded." + }, + "return": "AssetProxy-compliant data describing the set of assets." + }, + "getAssetProxyAllowance(address,bytes)": { + "details": "Returns the number of asset(s) (described by assetData) that the corresponding AssetProxy contract is authorized to spend. When the asset data contains multiple assets (eg for Multi-Asset), the return value indicates how many complete \"baskets\" of those assets may be spent by all of the corresponding AssetProxy contracts.", + "params": { + "assetData": "Details of asset, encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "Number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend." + }, + "getBalance(address,bytes)": { + "details": "Returns the owner's balance of the assets(s) specified in assetData. When the asset data contains multiple assets (eg in ERC1155 or Multi-Asset), the return value indicates how many complete \"baskets\" of those assets are owned by owner.", + "params": { + "assetData": "Details of asset, encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "Number of assets (or asset baskets) held by owner." + }, + "getBalanceAndAssetProxyAllowance(address,bytes)": { + "details": "Calls getBalance() and getAllowance() for assetData.", + "params": { + "assetData": "Details of asset, encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "Number of assets (or asset baskets) held by owner, and number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend." + }, + "getBatchAssetProxyAllowances(address,bytes[])": { + "details": "Calls getAssetProxyAllowance() for each element of assetData.", + "params": { + "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "An array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input." + }, + "getBatchBalances(address,bytes[])": { + "details": "Calls getBalance() for each element of assetData.", + "params": { + "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "Array of asset balances from getBalance(), with each element corresponding to the same-indexed element in the assetData input." + }, + "getBatchBalancesAndAssetProxyAllowances(address,bytes[])": { + "details": "Calls getBatchBalances() and getBatchAllowances() for each element of assetData.", + "params": { + "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.", + "ownerAddress": "Owner of the assets specified by assetData." + }, + "return": "An array of asset balances from getBalance(), and an array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input." + }, + "getERC721TokenOwner(address,uint256)": { + "details": "Calls `asset.ownerOf(tokenId)`, but returns a null owner instead of reverting on an unowned asset.", + "params": { + "tokenAddress": "Address of ERC721 asset.", + "tokenId": "The identifier for the specific NFT." + }, + "return": "Owner of tokenId or null address if unowned." + }, + "getEthBalances(address[])": { + "details": "Batch fetches ETH balances", + "params": { "addresses": "Array of addresses." }, + "return": "Array of ETH balances." + }, + "getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes)": { + "details": "Fetches all order-relevant information needed to validate if the supplied order is fillable.", + "params": { + "order": "The order structure.", + "signature": "Signature provided by maker that proves the order's authenticity. `0x01` can always be provided if the signature does not need to be validated." + }, + "return": "The orderInfo (hash, status, and `takerAssetAmount` already filled for the given order), fillableTakerAssetAmount (amount of the order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (validity of the provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, `fillableTakerAssetAmount` will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled." + }, + "getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes[])": { + "details": "Fetches all order-relevant information needed to validate if the supplied orders are fillable.", + "params": { + "orders": "Array of order structures.", + "signatures": "Array of signatures provided by makers that prove the authenticity of the orders. `0x01` can always be provided if a signature does not need to be validated." + }, + "return": "The ordersInfo (array of the hash, status, and `takerAssetAmount` already filled for each order), fillableTakerAssetAmounts (array of amounts for each order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (array containing the validity of each provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, each element of `fillableTakerAssetAmounts` will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled." + }, + "getTransferableAssetAmount(address,bytes)": { + "details": "Gets the amount of an asset transferable by the owner.", + "params": { + "assetData": "Description of tokens, per the AssetProxy contract specification.", + "ownerAddress": "Address of the owner of the asset." + }, + "return": "The amount of the asset tranferable by the owner. NOTE: If the `assetData` encodes data for multiple assets, the `transferableAssetAmount` will represent the amount of times the entire `assetData` can be transferred. To calculate the total individual transferable amounts, this scaled `transferableAmount` must be multiplied by the individual asset amounts located within the `assetData`." + } + } + }, + "evm": { + "bytecode": { + "object": "0x60806040523480156200001157600080fd5b5060405162004f8938038062004f898339810160408190526200003491620004ae565b600080546001600160a01b0319166001600160a01b0384811691909117918290556040517f60704108000000000000000000000000000000000000000000000000000000008152849284928492911690636070410890620000ba907ff47261b0000000000000000000000000000000000000000000000000000000009060040162000589565b60206040518083038186803b158015620000d357600080fd5b505afa158015620000e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200010e919081019062000488565b600180546001600160a01b0319166001600160a01b039283161790556000546040517f607041080000000000000000000000000000000000000000000000000000000081529116906360704108906200018c907f02571792000000000000000000000000000000000000000000000000000000009060040162000589565b60206040518083038186803b158015620001a557600080fd5b505afa158015620001ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001e0919081019062000488565b600280546001600160a01b0319166001600160a01b039283161790556000546040517f607041080000000000000000000000000000000000000000000000000000000081529116906360704108906200025e907fa7cb5fb7000000000000000000000000000000000000000000000000000000009060040162000589565b60206040518083038186803b1580156200027757600080fd5b505afa1580156200028c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002b2919081019062000488565b600380546001600160a01b0319166001600160a01b039283161790556000546040517f6070410800000000000000000000000000000000000000000000000000000000815291169063607041089062000330907fc339d10a000000000000000000000000000000000000000000000000000000009060040162000589565b60206040518083038186803b1580156200034957600080fd5b505afa1580156200035e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000384919081019062000488565b600480546001600160a01b0319166001600160a01b0392909216919091179055508051620003ba906005906020840190620003c5565b5050505050620005b6565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200040857805160ff191683800117855562000438565b8280016001018555821562000438579182015b82811115620004385782518255916020019190600101906200041b565b50620004469291506200044a565b5090565b6200046791905b8082111562000446576000815560010162000451565b90565b80516001600160a01b03811681146200048257600080fd5b92915050565b6000602082840312156200049b57600080fd5b620004a783836200046a565b9392505050565b60008060408385031215620004c1578081fd5b620004cd84846200046a565b602084810151919350906001600160401b0380821115620004ec578384fd5b81860187601f820112620004fe578485fd5b80519250818311156200050f578485fd5b604051601f8401601f19168101850183811182821017156200052f578687fd5b604052838152818401850189101562000546578586fd5b8592505b838310156200056957818301850151818401860152918401916200054a565b838311156200057a57858585830101525b80955050505050509250929050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6149c380620005c66000396000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80639eadc835116100ee578063b698846311610097578063d186037f11610071578063d186037f146103ce578063d3d862d1146103e1578063d965b998146103f4578063e4e6e7da146103fc576101a3565b8063b698846314610379578063bbb2dcf614610399578063d001c5dc146103bb576101a3565b8063a6627e9f116100c8578063a6627e9f1461034b578063b37fda041461035e578063b43cffe114610366576101a3565b80639eadc8351461030c578063a0901e5114610330578063a28fe02e14610343576101a3565b80636f83188e116101505780638ee1a6421161012a5780638ee1a642146102c15780638f4ce479146102c95780638f5afa52146102ea576101a3565b80636f83188e146102695780637d7275121461028c5780637f46448d1461029f576101a3565b80632322cf76116101815780632322cf76146102095780634dfdac2014610229578063590aa87514610249576101a3565b806304a5618a146101a85780630d7b7d76146101d35780631bd0eb8f146101f4575b600080fd5b6101bb6101b6366004613ccb565b61041d565b6040516101ca939291906143d1565b60405180910390f35b6101e66101e1366004613940565b6104e3565b6040516101ca929190614892565b6101fc610505565b6040516101ca91906142d4565b61021c610217366004613940565b610529565b6040516101ca9190614889565b61023c610237366004613858565b610551565b6040516101ca9190614239565b61025c61025736600461383b565b6105d4565b6040516101ca919061446e565b61027c610277366004613ccb565b610673565b6040516101ca94939291906144cc565b61021c61029a366004613940565b6114f7565b6102b26102ad366004613a83565b611b87565b6040516101ca9392919061419d565b6101fc611cbf565b6102dc6102d7366004613ccb565b611ce3565b6040516101ca929190614301565b6102fd6102f8366004613d8b565b611d8b565b6040516101ca93929190614852565b61031f61031a366004613ccb565b612081565b6040516101ca959493929190614349565b61023c61033e3660046139b2565b612144565b6101fc6121ca565b61025c610359366004613986565b6121ee565b6101fc612290565b61025c6103743660046138a8565b6122b4565b61038c610387366004613986565b61235c565b6040516101ca91906140d0565b6103ac6103a7366004613ccb565b61247a565b6040516101ca93929190614421565b61023c6103c9366004613858565b61253f565b61021c6103dc366004613940565b6125ad565b61025c6103ef366004613c02565b612cb5565b6101fc612cd2565b61040f61040a366004613858565b612cf6565b6040516101ca92919061427a565b60008080610431848263ffffffff612d0f16565b92507fffffffff0000000000000000000000000000000000000000000000000000000083167f0257179200000000000000000000000000000000000000000000000000000000146104b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae9061481b565b60405180910390fd5b6104c884601063ffffffff612d7a16565b91506104db84602463ffffffff612dd916565b929491935050565b6000806104f084846114f7565b91506104fc84846125ad565b90509250929050565b7fa7cb5fb70000000000000000000000000000000000000000000000000000000081565b600080600061053885856104e3565b915091506105468282612dec565b925050505b92915050565b606060008251905080604051908082528060200260200182016040528015610583578160200160208202803883390190505b50915060005b8181146105cc576105ad858583815181106105a057fe5b60200260200101516125ad565b8382815181106105b957fe5b6020908102919091010152600101610589565b505092915050565b606063f47261b060e01b826040516024016105ef91906140d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b6060808080600061068a868263ffffffff612d0f16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167f4ac14782000000000000000000000000000000000000000000000000000000001415610713576040518060400160405280601181526020017f626174636843616e63656c4f72646572730000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b00000000000000000000000000000000000000000000000000000000141561079a576040518060400160405280600f81526020017f626174636846696c6c4f726465727300000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde190000000000000000000000000000000000000000000000000000000001415610821576040518060400160405280601681526020017f626174636846696c6c4f72646572734e6f5468726f77000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae5460000000000000000000000000000000000000000000000000000000014156108a8576040518060400160405280601581526020017f626174636846696c6c4f724b696c6c4f726465727300000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fd46b02c300000000000000000000000000000000000000000000000000000000141561092f576040518060400160405280600b81526020017f63616e63656c4f726465720000000000000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d50000000000000000000000000000000000000000000000000000000014156109b6576040518060400160405280600981526020017f66696c6c4f7264657200000000000000000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae000000000000000000000000000000000000000000000000000000001415610a3d576040518060400160405280601081526020017f66696c6c4f726465724e6f5468726f77000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc15000000000000000000000000000000000000000000000000000000001415610ac4576040518060400160405280600f81526020017f66696c6c4f724b696c6c4f7264657200000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b000000000000000000000000000000000000000000000000000000001415610b4b576040518060400160405280600f81526020017f6d61726b65744275794f726465727300000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e20380000000000000000000000000000000000000000000000000000000001415610bd2576040518060400160405280601681526020017f6d61726b65744275794f72646572734e6f5468726f77000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d9808000000000000000000000000000000000000000000000000000000001415610c59576040518060400160405280601081526020017f6d61726b657453656c6c4f7264657273000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d18000000000000000000000000000000000000000000000000000000001415610ce0576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f770000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610d67576040518060400160405280600b81526020017f6d617463684f72646572730000000000000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f4f9559b1000000000000000000000000000000000000000000000000000000001480610df857507fffffffff0000000000000000000000000000000000000000000000000000000081167fbfc8bfce00000000000000000000000000000000000000000000000000000000145b15610e2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae9061472a565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906146f3565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f4ac14782000000000000000000000000000000000000000000000000000000001415610f1e578551610ec190879060049063ffffffff612e0216565b806020019051610ed49190810190613a4e565b604080516000808252602082019092529195505b5060408051600080825260208201909252919450610f16565b6060815260200190600190039081610f015790505b5091506114ef565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae546000000000000000000000000000000000000000000000000000000001480610faf57507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b80610ffb57507fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b00000000000000000000000000000000000000000000000000000000145b156110155761100986612ec7565b919550935091506114ef565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fd46b02c30000000000000000000000000000000000000000000000000000000014156111155760408051600180825281830190925290816020015b61107c6132e9565b81526020019060019003908161107457505086519094506110a790879060049063ffffffff612e0216565b8060200190516110ba9190810190613d56565b846000815181106110c757fe5b60200260200101819052506000604051908082528060200260200182016040528015610ee8578160200160208202803883390190505060408051600080825260208201909252919450610f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc150000000000000000000000000000000000000000000000000000000014806111a657507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d500000000000000000000000000000000000000000000000000000000145b806111f257507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b156112005761100986612f03565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000148061129157507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b806112dd57507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b8061132957507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b156113375761100986612ffd565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d8610000000000000000000000000000000000000000000000000000000014156114ef576113896132e9565b6113916132e9565b6060806113ab60048b518c612e029092919063ffffffff16565b8060200190516113be9190810190613de5565b604080516002808252606082019092529498509296509094509250816020015b6113e66132e9565b8152602001906001900390816113de579050509750838860008151811061140957fe5b6020026020010181905250828860018151811061142257fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a001518760008151811061146257fe5b6020026020010181815250508260a001518760018151811061148057fe5b60209081029190910101526040805160028082526060820190925290816020015b60608152602001906001900390816114a157905050955081866000815181106114c657fe5b602002602001018190525080866001815181106114df57fe5b6020026020010181905250505050505b509193509193565b60008061150a838263ffffffff612d0f16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000141561168857600061156984601063ffffffff612d7a16565b905060606370a0823160e01b8660405160240161158691906140d0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608373ffffffffffffffffffffffffffffffffffffffff168360405161160e91906140b4565b600060405180830381855afa9150503d8060008114611649576040519150601f19603f3d011682016040523d82523d6000602084013e61164e565b606091505b5091509150818015611661575080516020145b61166c57600061167d565b61167d81600063ffffffff612dd916565b955050505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f02571792000000000000000000000000000000000000000000000000000000001415611735576000806116de8561041d565b92509250508573ffffffffffffffffffffffffffffffffffffffff16611704838361235c565b73ffffffffffffffffffffffffffffffffffffffff1614611726576000611729565b60015b60ff1693505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb700000000000000000000000000000000000000000000000000000000141561191f57600060608061178d86612081565b5081519296509094509250905060005b81811461191557606062fdd58e60e01b8a8684815181106117ba57fe5b60200260200101516040516024016117d3929190614177565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608773ffffffffffffffffffffffffffffffffffffffff168360405161185b91906140b4565b600060405180830381855afa9150503d8060008114611896576040519150601f19603f3d011682016040523d82523d6000602084013e61189b565b606091505b509150915060008280156118b0575081516020145b6118bb5760006118cc565b6118cc82600063ffffffff612dd916565b905060008786815181106118dc57fe5b602002602001015182816118ec57fe5b0490508b8110806118fb57508b155b1561190457809b505b50506001909301925061179d915050565b5050505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a000000000000000000000000000000000000000000000000000000001415611ab157606063a85e59e460e01b84600080600060405160240161198c9493929190614481565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925060009173ffffffffffffffffffffffffffffffffffffffff1690611a369084906140b4565b600060405180830381855afa9150503d8060008114611a71576040519150601f19603f3d011682016040523d82523d6000602084013e611a76565b606091505b5050905080611a86576000611aa8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b93505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611b8057606080611b078561247a565b80519194509250905060005b818114611b7b576000611b3989858481518110611b2c57fe5b60200260200101516114f7565b90506000858381518110611b4957fe5b60200260200101518281611b5957fe5b04905087811080611b68575087155b15611b71578097505b5050600101611b13565b505050505b5092915050565b606080606060008551905080604051908082528060200260200182016040528015611bcc57816020015b611bb96133a2565b815260200190600190039081611bb15790505b50935080604051908082528060200260200182016040528015611bf9578160200160208202803883390190505b50925080604051908082528060200260200182016040528015611c26578160200160208202803883390190505b50915060005b818114611cb657611c63878281518110611c4257fe5b6020026020010151878381518110611c5657fe5b6020026020010151611d8b565b8751889085908110611c7157fe5b60200260200101878581518110611c8457fe5b60200260200101878681518110611c9757fe5b9315156020948502919091019093019290925291905252600101611c2c565b50509250925092565b7ff47261b00000000000000000000000000000000000000000000000000000000081565b600080611cf6838263ffffffff612d0f16565b91507fffffffff0000000000000000000000000000000000000000000000000000000082167ff47261b00000000000000000000000000000000000000000000000000000000014611d73576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae9061481b565b611d8483601063ffffffff612d7a16565b9050915091565b611d936133a2565b600080546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff169063c75e0a8190611dea908890600401614876565b60606040518083038186803b158015611e0257600080fd5b505afa158015611e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e3a9190810190613d00565b855160005460208301516040517f93634702000000000000000000000000000000000000000000000000000000008152939650919273ffffffffffffffffffffffffffffffffffffffff90911691639363470291611e9f919085908a9060040161429f565b60206040518083038186803b158015611eb757600080fd5b505afa158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611eef9190810190613ca9565b91506000611f0282886101400151610529565b60a088015160c08901516005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152959650939492936060939291830182828015611fba5780601f10611f8f57610100808354040283529160200191611fba565b820191906000526020600020905b815481529060010190602001808311611f9d57829003601f168201915b505050505090506000611fdb828c610140015161307190919063ffffffff16565b15611fff57611ff885611ff28d6080015186613096565b866130d5565b905061205b565b600061200b8784610529565b90508361202857612021868d60800151876130d5565b9150612059565b6000612039878e60800151886130d5565b905060006120488387896130d5565b90506120548282612dec565b935050505b505b61207261206c858b6040015161312b565b82612dec565b97505050505050509250925092565b60008060608080612098868563ffffffff612d0f16565b94507fffffffff0000000000000000000000000000000000000000000000000000000085167fa7cb5fb70000000000000000000000000000000000000000000000000000000014612115576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae9061481b565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b6060808251604051908082528060200260200182016040528015612172578160200160208202803883390190505b50905060005b83518114611b805783818151811061218c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16318282815181106121b757fe5b6020908102919091010152600101612178565b7f025717920000000000000000000000000000000000000000000000000000000081565b6060630257179260e01b838360405160240161220b929190614177565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b7f94cfcdd70000000000000000000000000000000000000000000000000000000081565b606063a7cb5fb760e01b858585856040516024016122d59493929190614118565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050949350505050565b60006060636352211e60e01b836040516024016123799190614889565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608573ffffffffffffffffffffffffffffffffffffffff168360405161240191906140b4565b600060405180830381855afa9150503d806000811461243c576040519150601f19603f3d011682016040523d82523d6000602084013e612441565b606091505b5091509150818015612454575080516020145b61245f576000612470565b61247081600c63ffffffff612d7a16565b9695505050505050565b600060608061248f848463ffffffff612d0f16565b92507fffffffff0000000000000000000000000000000000000000000000000000000083167f94cfcdd7000000000000000000000000000000000000000000000000000000001461250c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae9061481b565b835161252290859060049063ffffffff612e0216565b8060200190516125359190810190613c4f565b9395909450915050565b606060008251905080604051908082528060200260200182016040528015612571578160200160208202803883390190505b50915060005b8181146105cc5761258e85858381518110611b2c57fe5b83828151811061259a57fe5b6020908102919091010152600101612577565b6000806125c0838263ffffffff612d0f16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd700000000000000000000000000000000000000000000000000000000141561268a576060806126188561247a565b80519194509250905060005b81811461267f57600061263d898584815181106105a057fe5b9050600085838151811061264d57fe5b6020026020010151828161265d57fe5b0490508781108061266c575087155b15612675578097505b5050600101612624565b5061054b9350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000141561273a5760006126e784601063ffffffff612d7a16565b6001546040519192506060917fdd62ed3e000000000000000000000000000000000000000000000000000000009161158691899173ffffffffffffffffffffffffffffffffffffffff16906024016140f1565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f02571792000000000000000000000000000000000000000000000000000000001415612a68576000806127908561041d565b600254604051929550909350606092507fe985e9c500000000000000000000000000000000000000000000000000000000916127e9918a9173ffffffffffffffffffffffffffffffffffffffff909116906024016140f1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608473ffffffffffffffffffffffffffffffffffffffff168360405161287191906140b4565b600060405180830381855afa9150503d80600081146128ac576040519150601f19603f3d011682016040523d82523d6000602084013e6128b1565b606091505b50915091508115806128c557508051602014155b806128e157506128dc81600063ffffffff612dd916565b600114155b15612a3b57606063081812fc60e01b856040516024016129019190614889565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090508573ffffffffffffffffffffffffffffffffffffffff168160405161298591906140b4565b600060405180830381855afa9150503d80600081146129c0576040519150601f19603f3d011682016040523d82523d6000602084013e6129c5565b606091505b5090935091508280156129d9575081516020145b8015612a22575060025473ffffffffffffffffffffffffffffffffffffffff16612a0a83600c63ffffffff612d7a16565b73ffffffffffffffffffffffffffffffffffffffff16145b612a2d576000612a30565b60015b60ff16975050611915565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505050505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415612c42576000612abd84612081565b5050600354604051929450606093507fe985e9c50000000000000000000000000000000000000000000000000000000092612b149250899173ffffffffffffffffffffffffffffffffffffffff16906024016140f1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612b9c91906140b4565b600060405180830381855afa9150503d8060008114612bd7576040519150601f19603f3d011682016040523d82523d6000602084013e612bdc565b606091505b5091509150818015612bef575080516020145b8015612c0b5750612c0781600063ffffffff612dd916565b6001145b612c1657600061167d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff955050505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a000000000000000000000000000000000000000000000000000000001415611b8057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9392505050565b60606394cfcdd760e01b838360405160240161220b92919061424c565b7fc339d10a0000000000000000000000000000000000000000000000000000000081565b606080612d03848461253f565b91506104fc8484610551565b60008160040183511015612d4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906147be565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60008160140183511015612dba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae90614761565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6000612de5838361316d565b9392505050565b6000818310612dfb5781612de5565b5090919050565b606081831115612e3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae90614583565b8351821115612e79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906145ba565b8282036040519080825280601f01601f191660200182016040528015612ea6576020820181803883390190505b509050612de5612eb5826131b6565b84612ebf876131b6565b0183516131bc565b6060806060612ee36004855186612e029092919063ffffffff16565b806020019051612ef69190810190613b2b565b9196909550909350915050565b60408051600180825281830190925260609182918291816020015b612f266132e9565b815260200190600190039081612f1e5750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081612f6f5750508451909150612f9c90859060049063ffffffff612e0216565b806020019051612faf9190810190613e82565b85600081518110612fbc57fe5b6020026020010185600081518110612fd057fe5b6020026020010185600081518110612fe457fe5b6020908102919091010192909252919052529193909250565b6040805160018082528183019092526060918291829160208083019080388339505085519193506130399186915060049063ffffffff612e0216565b80602001905161304c9190810190613baf565b8451859060009061305957fe5b60209081029190910101919091529095929450925050565b600081518351148015612de55750508051602091820120825192909101919091201490565b600082820183811015612de5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906146bc565b6000808311613110576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae90614685565b61312361311d8584613280565b846132d4565b949350505050565b600082821115613167576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906145f1565b50900390565b600081602001835110156131ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae90614628565b50016020015190565b60200190565b60208110156131e6576001816020036101000a03801983511681855116808217865250505061327b565b828214156131f35761327b565b8282111561322d5760208103905080820181840181515b8285101561322557845186526020958601959094019361320a565b90525061327b565b60208103905080820181840183515b8186121561327657825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0928301929091019061323c565b855250505b505050565b60008261328f5750600061054b565b8282028284828161329c57fe5b0414612de5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906146bc565b6000808284816132e057fe5b04949350505050565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b604080516060810182526000808252602082018190529181019190915290565b803561054b8161495b565b805161054b8161495b565b600082601f8301126133e8578081fd5b81516133fb6133f6826148c7565b6148a0565b8181529150602080830190840160005b83811015613438576134238760208451890101613602565b8352602092830192919091019060010161340b565b5050505092915050565b600082601f830112613452578081fd5b81356134606133f6826148c7565b8181529150602080830190840160005b838110156134385761348887602084358901016135b4565b83526020928301929190910190600101613470565b600082601f8301126134ad578081fd5b81516134bb6133f6826148c7565b8181529150602080830190840160005b83811015613438576134e38760208451890101613748565b835260209283019291909101906001016134cb565b600082601f830112613508578081fd5b81516135166133f6826148c7565b81815291506020808301908481018184028601820187101561353757600080fd5b60005b84811015611b7b5781518452928201929082019060010161353a565b600082601f830112613566578081fd5b81356135746133f6826148c7565b81815291506020808301908481018184028601820187101561359557600080fd5b60005b84811015611b7b57813584529282019290820190600101613598565b600082601f8301126135c4578081fd5b81356135d26133f6826148e8565b91508082528360208285010111156135e957600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261361357600080fd5b81516136216133f6826148e8565b915080825283602082850101111561363857600080fd5b611b8081602084016020860161492b565b600061018080838503121561365c578182fd5b613665816148a0565b91505061367283836133c2565b815261368183602084016133c2565b602082015261369383604084016133c2565b60408201526136a583606084016133c2565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561370757600080fd5b613713868387016135b4565b8385015261016092508285013591508082111561372f57600080fd5b5061373c858286016135b4565b82840152505092915050565b600061018080838503121561375b578182fd5b613764816148a0565b91505061377183836133cd565b815261378083602084016133cd565b602082015261379283604084016133cd565b60408201526137a483606084016133cd565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff8082111561380657600080fd5b61381286838701613602565b8385015261016092508285015191508082111561382e57600080fd5b5061373c85828601613602565b60006020828403121561384d57600080fd5b8135612de58161495b565b6000806040838503121561386b57600080fd5b82356138768161495b565b9150602083013567ffffffffffffffff81111561389257600080fd5b61389e85828601613442565b9150509250929050565b600080600080608085870312156138bd578182fd5b84356138c88161495b565b9350602085013567ffffffffffffffff808211156138e4578384fd5b6138f088838901613556565b94506040870135915080821115613905578384fd5b61391188838901613556565b9350606087013591508082111561392757600080fd5b50613934878288016135b4565b91505092959194509250565b6000806040838503121561395357600080fd5b823561395e8161495b565b9150602083013567ffffffffffffffff81111561397a57600080fd5b61389e858286016135b4565b6000806040838503121561399957600080fd5b82356139a48161495b565b946020939093013593505050565b600060208083850312156139c4578182fd5b823567ffffffffffffffff8111156139da578283fd5b80840185601f8201126139eb578384fd5b803591506139fb6133f6836148c7565b8281528381019082850185850284018601891015613a17578687fd5b8693505b84841015613a42578035613a2e8161495b565b835260019390930192918501918501613a1b565b50979650505050505050565b600060208284031215613a6057600080fd5b815167ffffffffffffffff811115613a7757600080fd5b6131238482850161349d565b60008060408385031215613a95578182fd5b823567ffffffffffffffff80821115613aac578384fd5b81850186601f820112613abd578485fd5b80359250613acd6133f6846148c7565b83815260208082019190838101885b87811015613b0557613af38c848435890101613649565b85529382019390820190600101613adc565b50919750880135945050505080821115613b1e57600080fd5b5061389e85828601613442565b600080600060608486031215613b3f578081fd5b835167ffffffffffffffff80821115613b56578283fd5b613b628783880161349d565b94506020860151915080821115613b77578283fd5b613b83878388016134f8565b93506040860151915080821115613b98578283fd5b50613ba5868287016133d8565b9150509250925092565b600080600060608486031215613bc3578081fd5b835167ffffffffffffffff80821115613bda578283fd5b613be68783880161349d565b9450602086015193506040860151915080821115613b98578283fd5b60008060408385031215613c1557600080fd5b823567ffffffffffffffff80821115613c2d57600080fd5b613c3986838701613556565b93506020850135915080821115613b1e57600080fd5b60008060408385031215613c6257600080fd5b825167ffffffffffffffff80821115613c7a57600080fd5b613c86868387016134f8565b93506020850151915080821115613c9c57600080fd5b5061389e858286016133d8565b600060208284031215613cbb57600080fd5b81518015158114612de557600080fd5b600060208284031215613cdd57600080fd5b813567ffffffffffffffff811115613cf457600080fd5b613123848285016135b4565b60006060828403128015613d12578182fd5b8015613d1c578182fd5b50613d2760606148a0565b825160ff81168114613d37578283fd5b8152602083810151908201526040928301519281019290925250919050565b600060208284031215613d6857600080fd5b815167ffffffffffffffff811115613d7f57600080fd5b61312384828501613748565b60008060408385031215613d9e57600080fd5b823567ffffffffffffffff80821115613db657600080fd5b613dc286838701613649565b93506020850135915080821115613dd857600080fd5b5061389e858286016135b4565b60008060008060808587031215613dfa578182fd5b845167ffffffffffffffff80821115613e11578384fd5b613e1d88838901613748565b95506020870151915080821115613e32578384fd5b613e3e88838901613748565b94506040870151915080821115613e53578384fd5b613e5f88838901613602565b93506060870151915080821115613e7557600080fd5b5061393487828801613602565b600080600060608486031215613e96578081fd5b835167ffffffffffffffff80821115613ead578283fd5b613eb987838801613748565b9450602086015193506040860151915080821115613ed5578283fd5b50613ba586828701613602565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452602084018081955060208302810191506020850160005b84811015613f48578284038852613f32848351613f90565b6020988901989094509190910190600101613f1a565b50919695505050505050565b600081518084526020840193506020830160005b82811015613f86578151865260209586019590910190600101613f68565b5093949350505050565b60008151808452613fa881602086016020860161492b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805160ff16825260208082015190830152604090810151910152565b6000610180614006848451613ee2565b60208301516140186020860182613ee2565b50604083015161402b6040860182613ee2565b50606083015161403e6060860182613ee2565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261409783870182613f90565b915050610160915081840151858203838701526124708282613f90565b600082516140c681846020870161492b565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff86168252608060208301526141476080830186613f54565b82810360408401526141598186613f54565b838103606085015261416b8186613f90565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b606080825284519082018190526000906020906080840190828801845b828110156141e0576141cd848351613fda565b60609390930192908401906001016141ba565b505050838103828501526141f48187613f54565b8481036040860152855180825290830191508286019060005b8181101561422b57825115158452928401929184019160010161420d565b509198975050505050505050565b600060208252612de56020830184613f54565b60006040825261425f6040830185613f54565b82810360208401526142718185613efc565b95945050505050565b60006040825261428d6040830185613f54565b82810360208401526142718185613f54565b600084825273ffffffffffffffffffffffffffffffffffffffff84166020830152606060408301526142716060830184613f90565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60007fffffffff000000000000000000000000000000000000000000000000000000008716825273ffffffffffffffffffffffffffffffffffffffff8616602083015260a060408301526143a060a0830186613f54565b82810360608401526143b28186613f54565b83810360808501526143c48186613f90565b9998505050505050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000093909316835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b60007fffffffff00000000000000000000000000000000000000000000000000000000851682526060602083015261445c6060830185613f54565b82810360408401526124708185613efc565b600060208252612de56020830184613f90565b6000608082526144946080830187613f90565b73ffffffffffffffffffffffffffffffffffffffff958616602084015293909416604082015260ff9190911660609091015292915050565b6000608082526144df6080830187613f90565b602083820381850152818751808452828401915082838202850101838a0160005b8381101561454c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087840301855261453a838351613ff6565b94860194925090850190600101614500565b50508681036040880152614560818a613f54565b94505050505082810360608401526145788185613efc565b979650505050505050565b6020808252601a908201527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000604082015260600190565b6020808252601c908201527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000604082015260600190565b60208082526011908201527f55494e543235365f554e444552464c4f57000000000000000000000000000000604082015260600190565b60208082526026908201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560408201527f5155495245440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f4449564953494f4e5f42595f5a45524f00000000000000000000000000000000604082015260600190565b60208082526010908201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604082015260600190565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201527f554e494d504c454d454e54454400000000000000000000000000000000000000604082015260600190565b60208082526026908201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560408201527f5155495245440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160408201527f5549524544000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600e908201527f57524f4e475f50524f58595f4944000000000000000000000000000000000000604082015260600190565b60a081016148608286613fda565b8360608301528215156080830152949350505050565b600060208252612de56020830184613ff6565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156148bf57600080fd5b604052919050565b600067ffffffffffffffff8211156148de57600080fd5b5060209081020190565b600067ffffffffffffffff8211156148ff57600080fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561494657818101518382015260200161492e565b83811115614955576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461497d57600080fd5b5056fea365627a7a72305820b0089191876aedb7c9ca73a599fe9f1af81f739a05048f17544cc85e5cb803f86c6578706572696d656e74616cf564736f6c634300050a0040" + } + } + }, + "networks": {} +} diff --git a/packages/contract-artifacts/src/index.ts b/packages/contract-artifacts/src/index.ts index 4b41a79dcd..a1a5db3b8d 100644 --- a/packages/contract-artifacts/src/index.ts +++ b/packages/contract-artifacts/src/index.ts @@ -1,6 +1,7 @@ import * as AssetProxyOwner from '../artifacts/AssetProxyOwner.json'; import * as Coordinator from '../artifacts/Coordinator.json'; import * as CoordinatorRegistry from '../artifacts/CoordinatorRegistry.json'; +import * as DevUtils from '../artifacts/DevUtils.json'; import * as DummyERC20Token from '../artifacts/DummyERC20Token.json'; import * as DummyERC721Token from '../artifacts/DummyERC721Token.json'; import * as DutchAuction from '../artifacts/DutchAuction.json'; @@ -24,6 +25,7 @@ import * as ZRXToken from '../artifacts/ZRXToken.json'; export { AssetProxyOwner, DutchAuction, + DevUtils, DummyERC20Token, DummyERC721Token, ERC1155Proxy, diff --git a/packages/contract-artifacts/tsconfig.json b/packages/contract-artifacts/tsconfig.json index 196fa39163..7d339682c3 100644 --- a/packages/contract-artifacts/tsconfig.json +++ b/packages/contract-artifacts/tsconfig.json @@ -8,6 +8,7 @@ "include": ["./src/**/*", "./test/**/*"], "files": [ "./artifacts/AssetProxyOwner.json", + "./artifacts/DevUtils.json", "./artifacts/DutchAuction.json", "./artifacts/DummyERC20Token.json", "./artifacts/DummyERC721Token.json", diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json index bf405611c5..6d0e55910b 100644 --- a/packages/contract-wrappers/package.json +++ b/packages/contract-wrappers/package.json @@ -34,7 +34,7 @@ "docs_test": "typedoc --excludePrivate --excludeExternals --target ES5 --tsconfig typedoc-tsconfig.json --out generated_docs ./src/generated-wrappers/*" }, "config": { - "abis": "../contract-artifacts/artifacts/@(AssetProxyOwner|DutchAuction|DummyERC20Token|DummyERC721Token|ERC20Proxy|ERC20Token|ERC721Proxy|ERC721Token|Exchange|Forwarder|IAssetProxy|IValidator|IWallet|MultiAssetProxy|OrderValidator|WETH9|ZRXToken|Coordinator|CoordinatorRegistry|EthBalanceChecker).json" + "abis": "../contract-artifacts/artifacts/@(AssetProxyOwner|DevUtils|DutchAuction|DummyERC20Token|DummyERC721Token|ERC20Proxy|ERC20Token|ERC721Proxy|ERC721Token|Exchange|Forwarder|IAssetProxy|IValidator|IWallet|MultiAssetProxy|OrderValidator|WETH9|ZRXToken|Coordinator|CoordinatorRegistry|EthBalanceChecker).json" }, "repository": { "type": "git", diff --git a/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts b/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts new file mode 100644 index 0000000000..46c8884990 --- /dev/null +++ b/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts @@ -0,0 +1,3143 @@ +// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma +// tslint:disable:whitespace no-unbound-method no-trailing-whitespace +// tslint:disable:no-unused-variable +import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { schemas } from '@0x/json-schemas'; +import { + BlockParam, + BlockParamLiteral, + CallData, + ContractAbi, + ContractArtifact, + DecodedLogArgs, + MethodAbi, + TransactionReceiptWithDecodedLogs, + TxData, + TxDataPayable, + SupportedProvider, +} from 'ethereum-types'; +import { BigNumber, classUtils, logUtils, providerUtils } from '@0x/utils'; +import { SimpleContractArtifact } from '@0x/types'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import { assert } from '@0x/assert'; +import * as ethers from 'ethers'; +// tslint:enable:no-unused-variable + +/* istanbul ignore next */ +// tslint:disable:no-parameter-reassignment +// tslint:disable-next-line:class-name +export class DevUtilsContract extends BaseContract { + /** + * Decode ERC-721 asset data from the format described in the AssetProxy contract specification. + */ + public decodeERC721AssetData = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param assetData AssetProxy-compliant asset data describing an ERC-721 + * asset. + * @returns The ERC-721 AssetProxy identifier, the address of the ERC-721 contract hosting this asset, and the identifier of the specific asset to be traded. + */ + async callAsync( + assetData: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise<[string, string, BigNumber]> { + assert.isString('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('decodeERC721AssetData(bytes)', [assetData]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('decodeERC721AssetData(bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue<[string, string, BigNumber]>(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param assetData AssetProxy-compliant asset data describing an ERC-721 + * asset. + */ + getABIEncodedTransactionData(assetData: string): string { + assert.isString('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('decodeERC721AssetData(bytes)', [assetData]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): [string, string, BigNumber] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('decodeERC721AssetData(bytes)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode<[string, string, BigNumber]>(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): [string, string, BigNumber] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('decodeERC721AssetData(bytes)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<[string, string, BigNumber]>(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Calls getBalance() and getAllowance() for assetData. + */ + public getBalanceAndAssetProxyAllowance = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Details of asset, encoded per the AssetProxy contract + * specification. + * @returns Number of assets (or asset baskets) held by owner, and number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend. + */ + async callAsync( + ownerAddress: string, + assetData: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise<[BigNumber, BigNumber]> { + assert.isString('ownerAddress', ownerAddress); + assert.isString('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('getBalanceAndAssetProxyAllowance(address,bytes)', [ + ownerAddress.toLowerCase(), + assetData, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getBalanceAndAssetProxyAllowance(address,bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue<[BigNumber, BigNumber]>(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Details of asset, encoded per the AssetProxy contract + * specification. + */ + getABIEncodedTransactionData(ownerAddress: string, assetData: string): string { + assert.isString('ownerAddress', ownerAddress); + assert.isString('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments( + 'getBalanceAndAssetProxyAllowance(address,bytes)', + [ownerAddress.toLowerCase(), assetData], + ); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): [BigNumber, BigNumber] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getBalanceAndAssetProxyAllowance(address,bytes)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode<[BigNumber, BigNumber]>(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): [BigNumber, BigNumber] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getBalanceAndAssetProxyAllowance(address,bytes)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<[BigNumber, BigNumber]>(returnData); + return abiDecodedReturnData; + }, + }; + public ERC1155_PROXY_ID = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + */ + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('ERC1155_PROXY_ID()', []); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('ERC1155_PROXY_ID()'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + */ + getABIEncodedTransactionData(): string { + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('ERC1155_PROXY_ID()', []); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('ERC1155_PROXY_ID()'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('ERC1155_PROXY_ID()'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Gets the amount of an asset transferable by the owner. + */ + public getTransferableAssetAmount = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param ownerAddress Address of the owner of the asset. + * @param assetData Description of tokens, per the AssetProxy contract + * specification. + * @returns The amount of the asset tranferable by the owner. NOTE: If the `assetData` encodes data for multiple assets, the `transferableAssetAmount` will represent the amount of times the entire `assetData` can be transferred. To calculate the total individual transferable amounts, this scaled `transferableAmount` must be multiplied by the individual asset amounts located within the `assetData`. + */ + async callAsync( + ownerAddress: string, + assetData: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isString('ownerAddress', ownerAddress); + assert.isString('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('getTransferableAssetAmount(address,bytes)', [ + ownerAddress.toLowerCase(), + assetData, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getTransferableAssetAmount(address,bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param ownerAddress Address of the owner of the asset. + * @param assetData Description of tokens, per the AssetProxy contract + * specification. + */ + getABIEncodedTransactionData(ownerAddress: string, assetData: string): string { + assert.isString('ownerAddress', ownerAddress); + assert.isString('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('getTransferableAssetAmount(address,bytes)', [ + ownerAddress.toLowerCase(), + assetData, + ]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): BigNumber { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getTransferableAssetAmount(address,bytes)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): BigNumber { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getTransferableAssetAmount(address,bytes)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Calls getAssetProxyAllowance() for each element of assetData. + */ + public getBatchAssetProxyAllowances = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Array of asset details, each encoded per the AssetProxy + * contract specification. + * @returns An array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input. + */ + async callAsync( + ownerAddress: string, + assetData: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isString('ownerAddress', ownerAddress); + assert.isArray('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('getBatchAssetProxyAllowances(address,bytes[])', [ + ownerAddress.toLowerCase(), + assetData, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getBatchAssetProxyAllowances(address,bytes[])'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Array of asset details, each encoded per the AssetProxy + * contract specification. + */ + getABIEncodedTransactionData(ownerAddress: string, assetData: string[]): string { + assert.isString('ownerAddress', ownerAddress); + assert.isArray('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments( + 'getBatchAssetProxyAllowances(address,bytes[])', + [ownerAddress.toLowerCase(), assetData], + ); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): BigNumber[] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getBatchAssetProxyAllowances(address,bytes[])'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): BigNumber[] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getBatchAssetProxyAllowances(address,bytes[])'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Encode ERC-20 asset data into the format described in the AssetProxy contract specification. + */ + public encodeERC20AssetData = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param tokenAddress The address of the ERC-20 contract hosting the asset to + * be traded. + * @returns AssetProxy-compliant data describing the asset. + */ + async callAsync( + tokenAddress: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isString('tokenAddress', tokenAddress); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('encodeERC20AssetData(address)', [ + tokenAddress.toLowerCase(), + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('encodeERC20AssetData(address)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param tokenAddress The address of the ERC-20 contract hosting the asset to + * be traded. + */ + getABIEncodedTransactionData(tokenAddress: string): string { + assert.isString('tokenAddress', tokenAddress); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('encodeERC20AssetData(address)', [ + tokenAddress.toLowerCase(), + ]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('encodeERC20AssetData(address)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('encodeERC20AssetData(address)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Decodes the call data for an Exchange contract method call. + */ + public decodeZeroExTransactionData = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param transactionData ABI-encoded calldata for an Exchange contract + * method call. + * @returns The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element. + */ + async callAsync( + transactionData: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise< + [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + }>, + BigNumber[], + string[] + ] + > { + assert.isString('transactionData', transactionData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('decodeZeroExTransactionData(bytes)', [transactionData]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('decodeZeroExTransactionData(bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue< + [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + }>, + BigNumber[], + string[] + ] + >(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param transactionData ABI-encoded calldata for an Exchange contract + * method call. + */ + getABIEncodedTransactionData(transactionData: string): string { + assert.isString('transactionData', transactionData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('decodeZeroExTransactionData(bytes)', [ + transactionData, + ]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData( + callData: string, + ): [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + }>, + BigNumber[], + string[] + ] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('decodeZeroExTransactionData(bytes)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode< + [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + }>, + BigNumber[], + string[] + ] + >(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData( + returnData: string, + ): [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + }>, + BigNumber[], + string[] + ] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('decodeZeroExTransactionData(bytes)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue< + [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + }>, + BigNumber[], + string[] + ] + >(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Returns the owner's balance of the assets(s) specified in assetData. When the asset data contains multiple assets (eg in ERC1155 or Multi-Asset), the return value indicates how many complete "baskets" of those assets are owned by owner. + */ + public getBalance = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Details of asset, encoded per the AssetProxy contract + * specification. + * @returns Number of assets (or asset baskets) held by owner. + */ + async callAsync( + ownerAddress: string, + assetData: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isString('ownerAddress', ownerAddress); + assert.isString('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('getBalance(address,bytes)', [ + ownerAddress.toLowerCase(), + assetData, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getBalance(address,bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Details of asset, encoded per the AssetProxy contract + * specification. + */ + getABIEncodedTransactionData(ownerAddress: string, assetData: string): string { + assert.isString('ownerAddress', ownerAddress); + assert.isString('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('getBalance(address,bytes)', [ + ownerAddress.toLowerCase(), + assetData, + ]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): BigNumber { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getBalance(address,bytes)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): BigNumber { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getBalance(address,bytes)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Fetches all order-relevant information needed to validate if the supplied orders are fillable. + */ + public getOrderRelevantStates = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param orders Array of order structures. + * @param signatures Array of signatures provided by makers that prove the + * authenticity of the orders. `0x01` can always be provided if a signature + * does not need to be validated. + * @returns The ordersInfo (array of the hash, status, and `takerAssetAmount` already filled for each order), fillableTakerAssetAmounts (array of amounts for each order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (array containing the validity of each provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, each element of `fillableTakerAssetAmounts` will represent a "scaled" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled. + */ + async callAsync( + orders: Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + }>, + signatures: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise< + [ + Array<{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }>, + BigNumber[], + boolean[] + ] + > { + assert.isArray('orders', orders); + assert.isArray('signatures', signatures); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments( + 'getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes[])', + [orders, signatures], + ); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder( + 'getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes[])', + ); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue< + [ + Array<{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }>, + BigNumber[], + boolean[] + ] + >(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param orders Array of order structures. + * @param signatures Array of signatures provided by makers that prove the + * authenticity of the orders. `0x01` can always be provided if a signature + * does not need to be validated. + */ + getABIEncodedTransactionData( + orders: Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + }>, + signatures: string[], + ): string { + assert.isArray('orders', orders); + assert.isArray('signatures', signatures); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments( + 'getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes[])', + [orders, signatures], + ); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData( + callData: string, + ): [ + Array<{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }>, + BigNumber[], + boolean[] + ] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder( + 'getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes[])', + ); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode< + [ + Array<{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }>, + BigNumber[], + boolean[] + ] + >(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData( + returnData: string, + ): [ + Array<{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }>, + BigNumber[], + boolean[] + ] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder( + 'getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes[])', + ); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue< + [ + Array<{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }>, + BigNumber[], + boolean[] + ] + >(returnData); + return abiDecodedReturnData; + }, + }; + public ERC20_PROXY_ID = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + */ + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('ERC20_PROXY_ID()', []); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('ERC20_PROXY_ID()'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + */ + getABIEncodedTransactionData(): string { + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('ERC20_PROXY_ID()', []); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('ERC20_PROXY_ID()'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('ERC20_PROXY_ID()'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Decode ERC-20 asset data from the format described in the AssetProxy contract specification. + */ + public decodeERC20AssetData = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param assetData AssetProxy-compliant asset data describing an ERC-20 asset. + * @returns The ERC-20 AssetProxy identifier, and the address of the ERC-20 contract hosting this asset. + */ + async callAsync( + assetData: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise<[string, string]> { + assert.isString('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('decodeERC20AssetData(bytes)', [assetData]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('decodeERC20AssetData(bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue<[string, string]>(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param assetData AssetProxy-compliant asset data describing an ERC-20 asset. + */ + getABIEncodedTransactionData(assetData: string): string { + assert.isString('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('decodeERC20AssetData(bytes)', [assetData]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): [string, string] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('decodeERC20AssetData(bytes)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode<[string, string]>(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): [string, string] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('decodeERC20AssetData(bytes)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<[string, string]>(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Fetches all order-relevant information needed to validate if the supplied order is fillable. + */ + public getOrderRelevantState = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param order The order structure. + * @param signature Signature provided by maker that proves the order's + * authenticity. `0x01` can always be provided if the signature does not + * need to be validated. + * @returns The orderInfo (hash, status, and `takerAssetAmount` already filled for the given order), fillableTakerAssetAmount (amount of the order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (validity of the provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, `fillableTakerAssetAmount` will represent a "scaled" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled. + */ + async callAsync( + order: { + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + }, + signature: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise< + [{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }, BigNumber, boolean] + > { + assert.isString('signature', signature); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments( + 'getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes)', + [order, signature], + ); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder( + 'getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes)', + ); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue< + [{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }, BigNumber, boolean] + >(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param order The order structure. + * @param signature Signature provided by maker that proves the order's + * authenticity. `0x01` can always be provided if the signature does not + * need to be validated. + */ + getABIEncodedTransactionData( + order: { + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + }, + signature: string, + ): string { + assert.isString('signature', signature); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments( + 'getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes)', + [order, signature], + ); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData( + callData: string, + ): [{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }, BigNumber, boolean] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder( + 'getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes)', + ); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode< + [{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }, BigNumber, boolean] + >(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData( + returnData: string, + ): [{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }, BigNumber, boolean] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder( + 'getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes)', + ); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue< + [{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }, BigNumber, boolean] + >(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Decode ERC-1155 asset data from the format described in the AssetProxy contract specification. + */ + public decodeERC1155AssetData = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param assetData AssetProxy-compliant asset data describing an ERC-1155 set + * of assets. + * @returns The ERC-1155 AssetProxy identifier, the address of the ERC-1155 contract hosting the assets, an array of the identifiers of the assets to be traded, an array of asset amounts to be traded, and callback data. Each element of the arrays corresponds to the same-indexed element of the other array. Return values specified as `memory` are returned as pointers to locations within the memory of the input parameter `assetData`. + */ + async callAsync( + assetData: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise<[string, string, BigNumber[], BigNumber[], string]> { + assert.isString('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('decodeERC1155AssetData(bytes)', [assetData]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('decodeERC1155AssetData(bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue<[string, string, BigNumber[], BigNumber[], string]>( + rawCallResult, + ); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param assetData AssetProxy-compliant asset data describing an ERC-1155 set + * of assets. + */ + getABIEncodedTransactionData(assetData: string): string { + assert.isString('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('decodeERC1155AssetData(bytes)', [assetData]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): [string, string, BigNumber[], BigNumber[], string] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('decodeERC1155AssetData(bytes)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode<[string, string, BigNumber[], BigNumber[], string]>( + callData, + ); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): [string, string, BigNumber[], BigNumber[], string] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('decodeERC1155AssetData(bytes)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue< + [string, string, BigNumber[], BigNumber[], string] + >(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Batch fetches ETH balances + */ + public getEthBalances = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param addresses Array of addresses. + * @returns Array of ETH balances. + */ + async callAsync( + addresses: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isArray('addresses', addresses); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('getEthBalances(address[])', [addresses]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getEthBalances(address[])'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param addresses Array of addresses. + */ + getABIEncodedTransactionData(addresses: string[]): string { + assert.isArray('addresses', addresses); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('getEthBalances(address[])', [addresses]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): BigNumber[] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getEthBalances(address[])'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): BigNumber[] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getEthBalances(address[])'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + public ERC721_PROXY_ID = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + */ + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('ERC721_PROXY_ID()', []); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('ERC721_PROXY_ID()'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + */ + getABIEncodedTransactionData(): string { + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('ERC721_PROXY_ID()', []); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('ERC721_PROXY_ID()'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('ERC721_PROXY_ID()'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Encode ERC-721 asset data into the format described in the AssetProxy specification. + */ + public encodeERC721AssetData = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param tokenAddress The address of the ERC-721 contract hosting the asset to + * be traded. + * @param tokenId The identifier of the specific asset to be traded. + * @returns AssetProxy-compliant asset data describing the asset. + */ + async callAsync( + tokenAddress: string, + tokenId: BigNumber, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isString('tokenAddress', tokenAddress); + assert.isBigNumber('tokenId', tokenId); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('encodeERC721AssetData(address,uint256)', [ + tokenAddress.toLowerCase(), + tokenId, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('encodeERC721AssetData(address,uint256)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param tokenAddress The address of the ERC-721 contract hosting the asset to + * be traded. + * @param tokenId The identifier of the specific asset to be traded. + */ + getABIEncodedTransactionData(tokenAddress: string, tokenId: BigNumber): string { + assert.isString('tokenAddress', tokenAddress); + assert.isBigNumber('tokenId', tokenId); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('encodeERC721AssetData(address,uint256)', [ + tokenAddress.toLowerCase(), + tokenId, + ]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('encodeERC721AssetData(address,uint256)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('encodeERC721AssetData(address,uint256)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + public MULTI_ASSET_PROXY_ID = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + */ + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('MULTI_ASSET_PROXY_ID()', []); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('MULTI_ASSET_PROXY_ID()'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + */ + getABIEncodedTransactionData(): string { + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('MULTI_ASSET_PROXY_ID()', []); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('MULTI_ASSET_PROXY_ID()'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('MULTI_ASSET_PROXY_ID()'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Encode ERC-1155 asset data into the format described in the AssetProxy contract specification. + */ + public encodeERC1155AssetData = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param tokenAddress The address of the ERC-1155 contract hosting the + * asset(s) to be traded. + * @param tokenIds The identifiers of the specific assets to be traded. + * @param tokenValues The amounts of each asset to be traded. + * @param callbackData Data to be passed to receiving contracts when a transfer + * is performed. + * @returns AssetProxy-compliant asset data describing the set of assets. + */ + async callAsync( + tokenAddress: string, + tokenIds: BigNumber[], + tokenValues: BigNumber[], + callbackData: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isString('tokenAddress', tokenAddress); + assert.isArray('tokenIds', tokenIds); + assert.isArray('tokenValues', tokenValues); + assert.isString('callbackData', callbackData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments( + 'encodeERC1155AssetData(address,uint256[],uint256[],bytes)', + [tokenAddress.toLowerCase(), tokenIds, tokenValues, callbackData], + ); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('encodeERC1155AssetData(address,uint256[],uint256[],bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param tokenAddress The address of the ERC-1155 contract hosting the + * asset(s) to be traded. + * @param tokenIds The identifiers of the specific assets to be traded. + * @param tokenValues The amounts of each asset to be traded. + * @param callbackData Data to be passed to receiving contracts when a transfer + * is performed. + */ + getABIEncodedTransactionData( + tokenAddress: string, + tokenIds: BigNumber[], + tokenValues: BigNumber[], + callbackData: string, + ): string { + assert.isString('tokenAddress', tokenAddress); + assert.isArray('tokenIds', tokenIds); + assert.isArray('tokenValues', tokenValues); + assert.isString('callbackData', callbackData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments( + 'encodeERC1155AssetData(address,uint256[],uint256[],bytes)', + [tokenAddress.toLowerCase(), tokenIds, tokenValues, callbackData], + ); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('encodeERC1155AssetData(address,uint256[],uint256[],bytes)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('encodeERC1155AssetData(address,uint256[],uint256[],bytes)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Calls `asset.ownerOf(tokenId)`, but returns a null owner instead of reverting on an unowned asset. + */ + public getERC721TokenOwner = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param tokenAddress Address of ERC721 asset. + * @param tokenId The identifier for the specific NFT. + * @returns Owner of tokenId or null address if unowned. + */ + async callAsync( + tokenAddress: string, + tokenId: BigNumber, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isString('tokenAddress', tokenAddress); + assert.isBigNumber('tokenId', tokenId); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('getERC721TokenOwner(address,uint256)', [ + tokenAddress.toLowerCase(), + tokenId, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getERC721TokenOwner(address,uint256)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param tokenAddress Address of ERC721 asset. + * @param tokenId The identifier for the specific NFT. + */ + getABIEncodedTransactionData(tokenAddress: string, tokenId: BigNumber): string { + assert.isString('tokenAddress', tokenAddress); + assert.isBigNumber('tokenId', tokenId); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('getERC721TokenOwner(address,uint256)', [ + tokenAddress.toLowerCase(), + tokenId, + ]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getERC721TokenOwner(address,uint256)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getERC721TokenOwner(address,uint256)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Decode multi-asset data from the format described in the AssetProxy contract specification. + */ + public decodeMultiAssetData = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param assetData AssetProxy-compliant data describing a multi-asset basket. + * @returns The Multi-Asset AssetProxy identifier, an array of the amounts of the assets to be traded, and an array of the AssetProxy-compliant data describing each asset to be traded. Each element of the arrays corresponds to the same-indexed element of the other array. + */ + async callAsync( + assetData: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise<[string, BigNumber[], string[]]> { + assert.isString('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('decodeMultiAssetData(bytes)', [assetData]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('decodeMultiAssetData(bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue<[string, BigNumber[], string[]]>(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param assetData AssetProxy-compliant data describing a multi-asset basket. + */ + getABIEncodedTransactionData(assetData: string): string { + assert.isString('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('decodeMultiAssetData(bytes)', [assetData]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): [string, BigNumber[], string[]] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('decodeMultiAssetData(bytes)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode<[string, BigNumber[], string[]]>(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): [string, BigNumber[], string[]] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('decodeMultiAssetData(bytes)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<[string, BigNumber[], string[]]>( + returnData, + ); + return abiDecodedReturnData; + }, + }; + /** + * Calls getBalance() for each element of assetData. + */ + public getBatchBalances = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Array of asset details, each encoded per the AssetProxy + * contract specification. + * @returns Array of asset balances from getBalance(), with each element corresponding to the same-indexed element in the assetData input. + */ + async callAsync( + ownerAddress: string, + assetData: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isString('ownerAddress', ownerAddress); + assert.isArray('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('getBatchBalances(address,bytes[])', [ + ownerAddress.toLowerCase(), + assetData, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getBatchBalances(address,bytes[])'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Array of asset details, each encoded per the AssetProxy + * contract specification. + */ + getABIEncodedTransactionData(ownerAddress: string, assetData: string[]): string { + assert.isString('ownerAddress', ownerAddress); + assert.isArray('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('getBatchBalances(address,bytes[])', [ + ownerAddress.toLowerCase(), + assetData, + ]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): BigNumber[] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getBatchBalances(address,bytes[])'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): BigNumber[] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getBatchBalances(address,bytes[])'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Returns the number of asset(s) (described by assetData) that the corresponding AssetProxy contract is authorized to spend. When the asset data contains multiple assets (eg for Multi-Asset), the return value indicates how many complete "baskets" of those assets may be spent by all of the corresponding AssetProxy contracts. + */ + public getAssetProxyAllowance = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Details of asset, encoded per the AssetProxy contract + * specification. + * @returns Number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend. + */ + async callAsync( + ownerAddress: string, + assetData: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isString('ownerAddress', ownerAddress); + assert.isString('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('getAssetProxyAllowance(address,bytes)', [ + ownerAddress.toLowerCase(), + assetData, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getAssetProxyAllowance(address,bytes)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Details of asset, encoded per the AssetProxy contract + * specification. + */ + getABIEncodedTransactionData(ownerAddress: string, assetData: string): string { + assert.isString('ownerAddress', ownerAddress); + assert.isString('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('getAssetProxyAllowance(address,bytes)', [ + ownerAddress.toLowerCase(), + assetData, + ]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): BigNumber { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getAssetProxyAllowance(address,bytes)'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): BigNumber { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getAssetProxyAllowance(address,bytes)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Encode data for multiple assets, per the AssetProxy contract specification. + */ + public encodeMultiAssetData = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param amounts The amounts of each asset to be traded. + * @param nestedAssetData AssetProxy-compliant data describing each asset to be + * traded. + * @returns AssetProxy-compliant data describing the set of assets. + */ + async callAsync( + amounts: BigNumber[], + nestedAssetData: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isArray('amounts', amounts); + assert.isArray('nestedAssetData', nestedAssetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('encodeMultiAssetData(uint256[],bytes[])', [ + amounts, + nestedAssetData, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('encodeMultiAssetData(uint256[],bytes[])'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param amounts The amounts of each asset to be traded. + * @param nestedAssetData AssetProxy-compliant data describing each asset to be + * traded. + */ + getABIEncodedTransactionData(amounts: BigNumber[], nestedAssetData: string[]): string { + assert.isArray('amounts', amounts); + assert.isArray('nestedAssetData', nestedAssetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('encodeMultiAssetData(uint256[],bytes[])', [ + amounts, + nestedAssetData, + ]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('encodeMultiAssetData(uint256[],bytes[])'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('encodeMultiAssetData(uint256[],bytes[])'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + public STATIC_CALL_PROXY_ID = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + */ + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments('STATIC_CALL_PROXY_ID()', []); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('STATIC_CALL_PROXY_ID()'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + */ + getABIEncodedTransactionData(): string { + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments('STATIC_CALL_PROXY_ID()', []); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('STATIC_CALL_PROXY_ID()'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): string { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('STATIC_CALL_PROXY_ID()'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; + /** + * Calls getBatchBalances() and getBatchAllowances() for each element of assetData. + */ + public getBatchBalancesAndAssetProxyAllowances = { + /** + * Sends a read-only call to the contract method. Returns the result that would happen if one were to send an + * Ethereum transaction to this method, given the current state of the blockchain. Calls do not cost gas + * since they don't modify state. + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Array of asset details, each encoded per the AssetProxy + * contract specification. + * @returns An array of asset balances from getBalance(), and an array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input. + */ + async callAsync( + ownerAddress: string, + assetData: string[], + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise<[BigNumber[], BigNumber[]]> { + assert.isString('ownerAddress', ownerAddress); + assert.isArray('assetData', assetData); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as DevUtilsContract; + const encodedData = self._strictEncodeArguments( + 'getBatchBalancesAndAssetProxyAllowances(address,bytes[])', + [ownerAddress.toLowerCase(), assetData], + ); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('getBatchBalancesAndAssetProxyAllowances(address,bytes[])'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue<[BigNumber[], BigNumber[]]>(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + /** + * Returns the ABI encoded transaction data needed to send an Ethereum transaction calling this method. Before + * sending the Ethereum tx, this encoded tx data can first be sent to a separate signing service or can be used + * to create a 0x transaction (see protocol spec for more details). + * @param ownerAddress Owner of the assets specified by assetData. + * @param assetData Array of asset details, each encoded per the AssetProxy + * contract specification. + */ + getABIEncodedTransactionData(ownerAddress: string, assetData: string[]): string { + assert.isString('ownerAddress', ownerAddress); + assert.isArray('assetData', assetData); + const self = (this as any) as DevUtilsContract; + const abiEncodedTransactionData = self._strictEncodeArguments( + 'getBatchBalancesAndAssetProxyAllowances(address,bytes[])', + [ownerAddress.toLowerCase(), assetData], + ); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(callData: string): [BigNumber[], BigNumber[]] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getBatchBalancesAndAssetProxyAllowances(address,bytes[])'); + // tslint:disable boolean-naming + const abiDecodedCallData = abiEncoder.strictDecode<[BigNumber[], BigNumber[]]>(callData); + return abiDecodedCallData; + }, + getABIDecodedReturnData(returnData: string): [BigNumber[], BigNumber[]] { + const self = (this as any) as DevUtilsContract; + const abiEncoder = self._lookupAbiEncoder('getBatchBalancesAndAssetProxyAllowances(address,bytes[])'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<[BigNumber[], BigNumber[]]>(returnData); + return abiDecodedReturnData; + }, + }; + public static async deployFrom0xArtifactAsync( + artifact: ContractArtifact | SimpleContractArtifact, + supportedProvider: SupportedProvider, + txDefaults: Partial, + logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, + _exchange: string, + _zrxAssetData: string, + ): Promise { + assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (artifact.compilerOutput === undefined) { + throw new Error('Compiler output not found in the artifact file'); + } + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const bytecode = artifact.compilerOutput.evm.bytecode.object; + const abi = artifact.compilerOutput.abi; + const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {}; + if (Object.keys(logDecodeDependencies) !== undefined) { + for (const key of Object.keys(logDecodeDependencies)) { + logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi; + } + } + return DevUtilsContract.deployAsync( + bytecode, + abi, + provider, + txDefaults, + logDecodeDependenciesAbiOnly, + _exchange, + _zrxAssetData, + ); + } + public static async deployAsync( + bytecode: string, + abi: ContractAbi, + supportedProvider: SupportedProvider, + txDefaults: Partial, + logDecodeDependencies: { [contractName: string]: ContractAbi }, + _exchange: string, + _zrxAssetData: string, + ): Promise { + assert.isHexString('bytecode', bytecode); + assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const constructorAbi = BaseContract._lookupConstructorAbi(abi); + [_exchange, _zrxAssetData] = BaseContract._formatABIDataItemList( + constructorAbi.inputs, + [_exchange, _zrxAssetData], + BaseContract._bigNumberToString, + ); + const iface = new ethers.utils.Interface(abi); + const deployInfo = iface.deployFunction; + const txData = deployInfo.encode(bytecode, [_exchange, _zrxAssetData]); + const web3Wrapper = new Web3Wrapper(provider); + const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { data: txData }, + txDefaults, + web3Wrapper.estimateGasAsync.bind(web3Wrapper), + ); + const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); + logUtils.log(`transactionHash: ${txHash}`); + const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); + logUtils.log(`DevUtils successfully deployed at ${txReceipt.contractAddress}`); + const contractInstance = new DevUtilsContract( + txReceipt.contractAddress as string, + provider, + txDefaults, + logDecodeDependencies, + ); + contractInstance.constructorArgs = [_exchange, _zrxAssetData]; + return contractInstance; + } + + /** + * @returns The contract ABI + */ + public static ABI(): ContractAbi { + const abi = [ + { + constant: true, + inputs: [ + { + name: 'assetData', + type: 'bytes', + }, + ], + name: 'decodeERC721AssetData', + outputs: [ + { + name: 'assetProxyId', + type: 'bytes4', + }, + { + name: 'tokenAddress', + type: 'address', + }, + { + name: 'tokenId', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'ownerAddress', + type: 'address', + }, + { + name: 'assetData', + type: 'bytes', + }, + ], + name: 'getBalanceAndAssetProxyAllowance', + outputs: [ + { + name: 'balance', + type: 'uint256', + }, + { + name: 'allowance', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'ERC1155_PROXY_ID', + outputs: [ + { + name: '', + type: 'bytes4', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'ownerAddress', + type: 'address', + }, + { + name: 'assetData', + type: 'bytes', + }, + ], + name: 'getTransferableAssetAmount', + outputs: [ + { + name: 'transferableAssetAmount', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'ownerAddress', + type: 'address', + }, + { + name: 'assetData', + type: 'bytes[]', + }, + ], + name: 'getBatchAssetProxyAllowances', + outputs: [ + { + name: 'allowances', + type: 'uint256[]', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'tokenAddress', + type: 'address', + }, + ], + name: 'encodeERC20AssetData', + outputs: [ + { + name: 'assetData', + type: 'bytes', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'transactionData', + type: 'bytes', + }, + ], + name: 'decodeZeroExTransactionData', + outputs: [ + { + name: 'functionName', + type: 'string', + }, + { + name: 'orders', + type: 'tuple[]', + components: [ + { + name: 'makerAddress', + type: 'address', + }, + { + name: 'takerAddress', + type: 'address', + }, + { + name: 'feeRecipientAddress', + type: 'address', + }, + { + name: 'senderAddress', + type: 'address', + }, + { + name: 'makerAssetAmount', + type: 'uint256', + }, + { + name: 'takerAssetAmount', + type: 'uint256', + }, + { + name: 'makerFee', + type: 'uint256', + }, + { + name: 'takerFee', + type: 'uint256', + }, + { + name: 'expirationTimeSeconds', + type: 'uint256', + }, + { + name: 'salt', + type: 'uint256', + }, + { + name: 'makerAssetData', + type: 'bytes', + }, + { + name: 'takerAssetData', + type: 'bytes', + }, + ], + }, + { + name: 'takerAssetFillAmounts', + type: 'uint256[]', + }, + { + name: 'signatures', + type: 'bytes[]', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'ownerAddress', + type: 'address', + }, + { + name: 'assetData', + type: 'bytes', + }, + ], + name: 'getBalance', + outputs: [ + { + name: 'balance', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'orders', + type: 'tuple[]', + components: [ + { + name: 'makerAddress', + type: 'address', + }, + { + name: 'takerAddress', + type: 'address', + }, + { + name: 'feeRecipientAddress', + type: 'address', + }, + { + name: 'senderAddress', + type: 'address', + }, + { + name: 'makerAssetAmount', + type: 'uint256', + }, + { + name: 'takerAssetAmount', + type: 'uint256', + }, + { + name: 'makerFee', + type: 'uint256', + }, + { + name: 'takerFee', + type: 'uint256', + }, + { + name: 'expirationTimeSeconds', + type: 'uint256', + }, + { + name: 'salt', + type: 'uint256', + }, + { + name: 'makerAssetData', + type: 'bytes', + }, + { + name: 'takerAssetData', + type: 'bytes', + }, + ], + }, + { + name: 'signatures', + type: 'bytes[]', + }, + ], + name: 'getOrderRelevantStates', + outputs: [ + { + name: 'ordersInfo', + type: 'tuple[]', + components: [ + { + name: 'orderStatus', + type: 'uint8', + }, + { + name: 'orderHash', + type: 'bytes32', + }, + { + name: 'orderTakerAssetFilledAmount', + type: 'uint256', + }, + ], + }, + { + name: 'fillableTakerAssetAmounts', + type: 'uint256[]', + }, + { + name: 'isValidSignature', + type: 'bool[]', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'ERC20_PROXY_ID', + outputs: [ + { + name: '', + type: 'bytes4', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'assetData', + type: 'bytes', + }, + ], + name: 'decodeERC20AssetData', + outputs: [ + { + name: 'assetProxyId', + type: 'bytes4', + }, + { + name: 'tokenAddress', + type: 'address', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'order', + type: 'tuple', + components: [ + { + name: 'makerAddress', + type: 'address', + }, + { + name: 'takerAddress', + type: 'address', + }, + { + name: 'feeRecipientAddress', + type: 'address', + }, + { + name: 'senderAddress', + type: 'address', + }, + { + name: 'makerAssetAmount', + type: 'uint256', + }, + { + name: 'takerAssetAmount', + type: 'uint256', + }, + { + name: 'makerFee', + type: 'uint256', + }, + { + name: 'takerFee', + type: 'uint256', + }, + { + name: 'expirationTimeSeconds', + type: 'uint256', + }, + { + name: 'salt', + type: 'uint256', + }, + { + name: 'makerAssetData', + type: 'bytes', + }, + { + name: 'takerAssetData', + type: 'bytes', + }, + ], + }, + { + name: 'signature', + type: 'bytes', + }, + ], + name: 'getOrderRelevantState', + outputs: [ + { + name: 'orderInfo', + type: 'tuple', + components: [ + { + name: 'orderStatus', + type: 'uint8', + }, + { + name: 'orderHash', + type: 'bytes32', + }, + { + name: 'orderTakerAssetFilledAmount', + type: 'uint256', + }, + ], + }, + { + name: 'fillableTakerAssetAmount', + type: 'uint256', + }, + { + name: 'isValidSignature', + type: 'bool', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'assetData', + type: 'bytes', + }, + ], + name: 'decodeERC1155AssetData', + outputs: [ + { + name: 'assetProxyId', + type: 'bytes4', + }, + { + name: 'tokenAddress', + type: 'address', + }, + { + name: 'tokenIds', + type: 'uint256[]', + }, + { + name: 'tokenValues', + type: 'uint256[]', + }, + { + name: 'callbackData', + type: 'bytes', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'addresses', + type: 'address[]', + }, + ], + name: 'getEthBalances', + outputs: [ + { + name: '', + type: 'uint256[]', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'ERC721_PROXY_ID', + outputs: [ + { + name: '', + type: 'bytes4', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'tokenAddress', + type: 'address', + }, + { + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'encodeERC721AssetData', + outputs: [ + { + name: 'assetData', + type: 'bytes', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'MULTI_ASSET_PROXY_ID', + outputs: [ + { + name: '', + type: 'bytes4', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'tokenAddress', + type: 'address', + }, + { + name: 'tokenIds', + type: 'uint256[]', + }, + { + name: 'tokenValues', + type: 'uint256[]', + }, + { + name: 'callbackData', + type: 'bytes', + }, + ], + name: 'encodeERC1155AssetData', + outputs: [ + { + name: 'assetData', + type: 'bytes', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'tokenAddress', + type: 'address', + }, + { + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'getERC721TokenOwner', + outputs: [ + { + name: 'ownerAddress', + type: 'address', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'assetData', + type: 'bytes', + }, + ], + name: 'decodeMultiAssetData', + outputs: [ + { + name: 'assetProxyId', + type: 'bytes4', + }, + { + name: 'amounts', + type: 'uint256[]', + }, + { + name: 'nestedAssetData', + type: 'bytes[]', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'ownerAddress', + type: 'address', + }, + { + name: 'assetData', + type: 'bytes[]', + }, + ], + name: 'getBatchBalances', + outputs: [ + { + name: 'balances', + type: 'uint256[]', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'ownerAddress', + type: 'address', + }, + { + name: 'assetData', + type: 'bytes', + }, + ], + name: 'getAssetProxyAllowance', + outputs: [ + { + name: 'allowance', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'amounts', + type: 'uint256[]', + }, + { + name: 'nestedAssetData', + type: 'bytes[]', + }, + ], + name: 'encodeMultiAssetData', + outputs: [ + { + name: 'assetData', + type: 'bytes', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'STATIC_CALL_PROXY_ID', + outputs: [ + { + name: '', + type: 'bytes4', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: 'ownerAddress', + type: 'address', + }, + { + name: 'assetData', + type: 'bytes[]', + }, + ], + name: 'getBatchBalancesAndAssetProxyAllowances', + outputs: [ + { + name: 'balances', + type: 'uint256[]', + }, + { + name: 'allowances', + type: 'uint256[]', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + name: '_exchange', + type: 'address', + }, + { + name: '_zrxAssetData', + type: 'bytes', + }, + ], + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'constructor', + }, + ] as ContractAbi; + return abi; + } + constructor( + address: string, + supportedProvider: SupportedProvider, + txDefaults?: Partial, + logDecodeDependencies?: { [contractName: string]: ContractAbi }, + ) { + super('DevUtils', DevUtilsContract.ABI(), address, supportedProvider, txDefaults, logDecodeDependencies); + classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + } +} + +// tslint:disable:max-file-line-count +// tslint:enable:no-unbound-method no-parameter-reassignment no-consecutive-blank-lines ordered-imports align +// tslint:enable:trailing-comma whitespace no-trailing-whitespace diff --git a/packages/contract-wrappers/src/index.ts b/packages/contract-wrappers/src/index.ts index 7ab661f92f..9fbb8d0f59 100644 --- a/packages/contract-wrappers/src/index.ts +++ b/packages/contract-wrappers/src/index.ts @@ -1,4 +1,5 @@ export * from './generated-wrappers/asset_proxy_owner'; +export * from './generated-wrappers/dev_utils'; export * from './generated-wrappers/dummy_erc20_token'; export * from './generated-wrappers/dummy_erc721_token'; export * from './generated-wrappers/dutch_auction'; diff --git a/packages/migrations/CHANGELOG.json b/packages/migrations/CHANGELOG.json index 25b4e94567..85a42100df 100644 --- a/packages/migrations/CHANGELOG.json +++ b/packages/migrations/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "4.3.0", + "changes": [ + { + "note": "Added DevUtils to migration script", + "pr": 2060 + } + ] + }, { "version": "4.2.0", "changes": [ diff --git a/packages/migrations/src/migration.ts b/packages/migrations/src/migration.ts index 4ca5a3bcb3..b6ca254959 100644 --- a/packages/migrations/src/migration.ts +++ b/packages/migrations/src/migration.ts @@ -252,6 +252,16 @@ export async function runMigrationsAsync( exchange.address, ); + // Dev Utils + const devUtils = await wrappers.DevUtilsContract.deployFrom0xArtifactAsync( + artifacts.DevUtils, + provider, + txDefaults, + artifacts, + exchange.address, + zrxAssetData, + ); + const contractAddresses = { erc20Proxy: erc20Proxy.address, erc721Proxy: erc721Proxy.address, @@ -267,6 +277,7 @@ export async function runMigrationsAsync( coordinator: coordinator.address, multiAssetProxy: multiAssetProxy.address, staticCallProxy: staticCallProxy.address, + devUtils: devUtils.address, }; return contractAddresses; diff --git a/packages/python-contract-wrappers/package.json b/packages/python-contract-wrappers/package.json index 87f39a6a8d..c2540dee19 100644 --- a/packages/python-contract-wrappers/package.json +++ b/packages/python-contract-wrappers/package.json @@ -13,7 +13,7 @@ "clean": "shx rm -rf generated" }, "config": { - "abis": "../contract-artifacts/artifacts/{AssetProxyOwner,Coordinator,CoordinatorRegistry,DummyERC20Token,DummyERC721Token,DutchAuction,ERC20Proxy,ERC20Token,ERC721Proxy,ERC721Token,EthBalanceChecker,Exchange,Forwarder,IAssetProxy,IValidator,IWallet,MultiAssetProxy,OrderValidator,WETH9,ZRXToken}.json" + "abis": "../contract-artifacts/artifacts/{AssetProxyOwner,Coordinator,CoordinatorRegistry,DevUtils,DummyERC20Token,DummyERC721Token,DutchAuction,ERC20Proxy,ERC20Token,ERC721Proxy,ERC721Token,EthBalanceChecker,Exchange,Forwarder,IAssetProxy,IValidator,IWallet,MultiAssetProxy,OrderValidator,WETH9,ZRXToken}.json" }, "repository": { "type": "git", diff --git a/python-packages/contract_wrappers/CHANGELOG.md b/python-packages/contract_wrappers/CHANGELOG.md index 2e2e6b1be3..cece9b4f96 100644 --- a/python-packages/contract_wrappers/CHANGELOG.md +++ b/python-packages/contract_wrappers/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 1.1.0 - TBD + +- Added wrapper for DevUtils contract. + ## 1.0.3 - 2019-08-10 - Added erroneously missing source files. diff --git a/python-packages/contract_wrappers/setup.py b/python-packages/contract_wrappers/setup.py index 5e32f31773..1ab2c84775 100755 --- a/python-packages/contract_wrappers/setup.py +++ b/python-packages/contract_wrappers/setup.py @@ -22,6 +22,7 @@ CONTRACTS_TO_BE_WRAPPED = [ "asset_proxy_owner", "coordinator", "coordinator_registry", + "dev_utils", "dummy_erc20_token", "dummy_erc721_token", "dutch_auction", diff --git a/python-packages/contract_wrappers/src/index.rst b/python-packages/contract_wrappers/src/index.rst index 8db1712254..2cb98cea20 100644 --- a/python-packages/contract_wrappers/src/index.rst +++ b/python-packages/contract_wrappers/src/index.rst @@ -33,6 +33,14 @@ zero_ex.contract_wrappers.coordinator_registry :special-members: +zero_ex.contract_wrappers.dev_utils +======================================= + +.. automodule:: zero_ex.contract_wrappers.dev_utils + :members: + :special-members: + + zero_ex.contract_wrappers.dutch_auction ======================================= diff --git a/python-packages/contract_wrappers/src/zero_ex/contract_wrappers/dev_utils/.gitkeep b/python-packages/contract_wrappers/src/zero_ex/contract_wrappers/dev_utils/.gitkeep new file mode 100644 index 0000000000..e69de29bb2